0
votes

I'm trying to develop a small API using express. Just want to have 2 views, which, in my case, means 2 html files. One accesing as default with "/" and the other with "/lessons", so we got 2 get controls plus another one which handles every other get input.

*Both files are in the "views" folder and their extension is: *.html

I have no problem accessing the "app.get("/lessons", function..." in fact I know I can acces to that because a simple "console.log(..)" command. The problem is that I got the next error when trying to render:

[TypeError: this.engine is not a function].

Could you help me? I can't understand where is the problem or what I'm doing wrong. I believe it's in the rendering function and has something to do with its configuration and the lessons.html file because index.html has no problem using the same approach.

var express = require('express');
var app = express();
var mod = require('./module');

app.use(express.static('public'));
app.use(express.static('views'));

var port = process.env.PORT || 8080;
app.listen(port, function() {
    console.log('Node.js listening on port ' + port);
});

app.get("/", function(req, res) {
    console.log("Passed through /");
    res.render('index.html');
});

app.get("/lessons", function(req, res) {
    console.log("passed through lessons");
    res.render('lessons.html', function(err, html) {
        if(err) {
            console.log(err);
        }
        res.send(html);
    });
    //I have tried to to use just: res.render('lessons.html');
});

app.get("*", function(req, res) {
    var usageReq = false;
    var urlPassed = req.url;
    urlPassed = urlPassed.substring(1, urlPassed.length); //remove first "/"

    var expected = mod.seeIfExpected(urlPassed); //returns url(if url) or num(if number) or na(if it doesn't match any)
    mod.processInfo(expected, urlPassed, function(answer) {
        if (answer.found == false && answer.jsonRes == true && answer.info != "inserted") {
            res.json({
                "error": answer.info   
            });
        } else {
            if (answer.jsonRes == true) {
                res.json({
                   "long_url": answer.url,
                   "short_url": answer.id
                });
            } else { // go to url
                var newUrl = "https://" + answer.url;
                res.redirect(newUrl);
            }
    }
});

});

So you mean you get error at if statement in the res.render('lesson.html')'s callback? - Lee Han Kyeol
@LeeHanKyeol Yes, it's exactly that. It's there where I got the this.engine is not a function error. The server does catch "/lessons" get entry, then it starts running the content of the callback function but it gets an error when it arrives to res.render('lessons.html'). For example, I know that the problem is in render because if I put res.json({"json printed}) it does behave as expected. - Vale PorTi