Node.js TypeError:尝试在Express JS中使用Moustache时,this.engine不是函数

Node.js TypeError:尝试在Express JS中使用Moustache时,this.engine不是函数,node.js,express,template-engine,mustache,Node.js,Express,Template Engine,Mustache,作为我在NodeJS上尝试的第一件事,我正在构建一个简单的应用程序,它显示一个HTML页面,告诉访问者他们的IP地址 下面是它的样子 var express = require('express'); var app = express(); app.set('view engine', 'mu2'); app.get('/', function (req, res) { res.setHeader('Content-Type', 'text/html'); // Do I h

作为我在NodeJS上尝试的第一件事,我正在构建一个简单的应用程序,它显示一个HTML页面,告诉访问者他们的IP地址

下面是它的样子

var express = require('express');
var app = express();

app.set('view engine', 'mu2');

app.get('/', function (req, res) {
    res.setHeader('Content-Type', 'text/html');    // Do I have to do this? I'm not sure.
    res.render('frontPage.html', {
        ip: req.ip
    });
res.send();
});

app.listen(8080, function() {
    console.log("Listening on port 8080");
});
以下是
/views/frontPage.html
的外观:

<!DOCTYPE html>
<html>
    <head>
        <title>Hello, World!</title>
    </head>
    <body>
        <h1>Hello, World!</h1>
        <hr>
        <p>If you're reading this, the NodeJS setup is working. Check your developer console. See if there's any HTTP error in there.</p>
        <p>Anyway, your IP address is {{ip}}</p>
    </body>
</html>
我已经在
views/
中设置了
frontPage.html
,并且我已经从NPM安装了moustach(
NPM install mu2--save
)。
有什么问题吗?

您需要将文件扩展名从.html更改为.mu2<代码>res.render('frontPage.mu2',{ip:req.ip})因为它是一个小胡子文件而不是HTML文件。您还可以关闭文件扩展名,因为您将默认视图渲染器设置为mu2,如果未提供文件扩展名,express将使用该文件扩展名作为渲染引擎。 像这样<代码>res.render('frontPage',{ip:req.ip})。请注意,第一部分是文件路径“/frontPage”,第二部分是传递给模板的本地对象。您可以在.mu2文件中访问该对象的ip属性,类似这样的
{{ip}}
。Moustach返回要表达的呈现HTML,res.render将其发送到客户端

此外,您不需要res.send(),因为res.render()呈现视图,并将呈现的HTML字符串发送给客户端,而且由于响应或类型字符串上也假定为text/HTML,所以您不需要res.setHeader('Content-type','text-HTML');但两者都不是

res.render(视图[,局部变量][,回调]) 呈现视图并将呈现的HTML字符串发送到客户端。可选参数:

局部变量,其属性定义视图的局部变量的对象

回调,一个回调函数。如果提供,该方法将返回可能的错误和呈现的字符串,但不执行自动响应。当发生错误时,该方法在内部调用next(err)

view参数是一个字符串,它是要渲染的视图文件的文件路径。这可以是绝对路径,也可以是相对于视图设置的路径。如果路径不包含文件扩展名,则视图引擎设置将确定文件扩展名。如果路径确实包含文件扩展名,则Express将加载指定模板引擎的模块(通过require()),并使用加载的模块的_Express函数进行渲染


我最终绕过了Express的模板系统,使用了Mustach自己的
compileAndender()
。像这样:

var express = require('express');
var app = express();
var mu2 = require('mu2');
mu2.root = __dirname + '/views';

app.get('/', function (req, res) {
    var htmlStream = mu2.compileAndRender('frontPage.html', {ip: req.ip});
    htmlStream.pipe(res);
});

app.listen(8080, function () {
    console.log("Listening on port 8080");
});

它现在可以工作了。

因此,我删除了头声明、
send()
和模板文件的扩展名。我还将
frontPage.html
重命名为
frontPage.mu2
视图的开头添加了
/
。现在整行的内容是
res.render('/frontPage',{ip:req.ip})不幸的是,现在它告诉我
在views目录/Users/macuser/NodeJS/hello/views中查找视图/frontPage失败“
您尝试过不使用“/”吗?res.render('frontPage',{ip:req.ip});六羟甲基三聚氰胺六甲醚。。。你在哪里安装了小胡子?该错误似乎表明它无法解析模板或模板引擎。我会尝试运行npm install mustache——保存在您的工作目录中,或者为全局安装添加-g选项。npm安装-g小胡子,看看是否有效。我很难重现你的错误。如果你喜欢胡子,试试把手。。。在hbs下的Express的github页面上,它被列为“开箱即用”兼容。在做了一些研究之后,我发现了一些关于Express与Mustache兼容的不一致之处。即使网站上的指南说它是兼容的,胡子也不在这里的列表中:
var express = require('express');
var app = express();
var mu2 = require('mu2');
mu2.root = __dirname + '/views';

app.get('/', function (req, res) {
    var htmlStream = mu2.compileAndRender('frontPage.html', {ip: req.ip});
    htmlStream.pipe(res);
});

app.listen(8080, function () {
    console.log("Listening on port 8080");
});