Node.js nodejs车把';TypeError:this.engine不是函数';

Node.js nodejs车把';TypeError:this.engine不是函数';,node.js,express,handlebars.js,render,Node.js,Express,Handlebars.js,Render,我尝试在Express中使用把手模板。我收到以下错误消息: TypeError:此.engine不是函数 在View.render(/home/ubuntu/workspace/node_modules/express/lib/View.js:128:8) 使用此代码: 'use strict'; var express = require('express'); var expressHandlebars = require('express-handlebars'); var app

我尝试在Express中使用把手模板。我收到以下错误消息:

TypeError:此.engine不是函数 在View.render(/home/ubuntu/workspace/node_modules/express/lib/View.js:128:8)

使用此代码:

'use strict';

var express = require('express');
var expressHandlebars  = require('express-handlebars');

var app = express();

app.engine('handlebars', expressHandlebars({defaultLayout: 'layout'}));
app.set('view engine', 'html');
app.use(express.static('views'));

app.route('/single/:id')
    .get(function (req, res) {
        res.render(process.cwd() + `/public/single-poll`, {
            id: req.params.id
        });
    });

app.listen(process.env.PORT,  function () {
    console.log('Node.js listening on port ' + process.env.PORT + '...');
});
当我用sendFile()替换render()函数时,效果很好。我知道和,但他们没有帮我


可能是什么问题?

由于您的把手模板文件保存为
.html
,因此您应该将引擎注册为
'html'
,而不是
'handlebar'

app.engine('html', expressHandlebars({defaultLayout: 'layout', extname: '.html', layoutsDir: 'public/'}));
app.set('view engine', 'html');
app.set('views', 'public/');

// ...
res.render('single-poll', ...);
您的项目目录应该如下所示(我希望):


找到所有需要更改的内容后,我真的建议您坐下来,因为我建议的所有内容都是现成的。

感谢@Patrick Roberts关于阅读手册的评论,我重新编写了它,它就是这样工作的:

'use strict';

var express = require('express');
var exphbs  = require('express-handlebars');

var app = express();

app.engine('handlebars', exphbs({defaultLayout: 'main'}));
app.set('view engine', 'handlebars');

app.route('/single/:id')
    .get(function (req, res) {
        res.render('single-poll', {
            id: req.params.id
        });
    });

app.listen(process.env.PORT,  function () {
    console.log('Node.js listening on port ' + process.env.PORT + '...');
});
我认为,主要是将文件结构更改为:

├── app.js
    └── views
        ├── single-poll.handlebars
        └── layouts
            └── main.handlebars

尝试从
res.render()
调用中删除文件扩展名。这能解决问题吗?不,不能。
├── app.js
    └── views
        ├── single-poll.handlebars
        └── layouts
            └── main.handlebars