nodejs handlebars:'TypeError:this.engine不是一个函数'

我尝试使用Express中的句柄模板。 我得到这个错误消息:

TypeError:this.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()replacerender()函数是正常的。 我知道快速js渲染:TypeError:this.engine不是一个函数和Express js呈现错误this.engine不是一个函数和TypeError:this.engine不是一个函数时,试图在Express JS使用胡子 ,但他们没有帮我。

可能是什么问题?

由于你的句柄模板文件保存为.html ,你应该注册引擎为'html'而不是'handlebars'

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

而你的项目目录应该是这样的(我希望):

 ├── app.js └── public ├── layout.html └── single-poll.html 

find所有你需要改变的东西后,我真的build议你坐下来阅读*******手册 ,因为我所build议的一切都是正确的。

感谢@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