为什么 express 告诉我默认的视图引擎没有定义?
为什么 express 告诉我默认的视图引擎没有定义?
我在我的应用程序的后端使用nodejs和mongodb。我正在使用express来测试应用程序,并尝试使用ejs来渲染我的html文件。然而,我的默认视图引擎未定义,我遇到了问题。
这是我的app.js:
/** * 模块依赖。 */ var express = require('express') , routes = require('./routes') , user = require('./routes/user') , http = require('http') , path = require('path'); var conf = require('./conf'); var app = express(); var mongoose = require('mongoose'); , Schema = mongoose.Schema , ObjectId = mongooseSchemaTypes.ObjectID; var UserSchema = new Schema({}) , User; // 所有环境 app.set('port', process.env.PORT || 3000); app.set('view engine', 'ejs'); app.engine('.html', require('ejs').renderFile()); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); // 仅开发环境 if ('development' == app.get('env')) { app.use(express.errorHandler()); } app.get('/', routes.index); app.get('/users', user.list); http.createServer(app).listen(app.get('port'), function(){ console.log('Express服务器监听端口 ' + app.get('port')); });
这是我的package.json:
{
"name": "application-name",
"version": "0.0.1",
"private": true,
"dependencies": {
"express": "3.3.3",
"ejs":">= 0.0.1",
"mongoose-auth": ">= 0.0.12",
"mongoose": ">=2.4.8",
"everyauth": ">=0.2.28"
}
}
错误:
Express
500错误:无法找到视图"index"
at Function.app.render (/home/christian/node_modules/nave/create/node_modules/express/lib/application.js:494:17) at ServerResponse.res.render (/home/christian/node_modules/nave/create/node_modules/express/lib/response.js:756:7) at exports.index (/home/christian/node_modules/nave/create/routes/index.js:7:7) at callbacks (/home/christian/node_modules/nave/create/node_modules/express/lib/router/index.js:161:37) at param (/home/christian/node_modules/nave/create/node_modules/express/lib/router/index.js:135:11) at pass (/home/christian/node_modules/nave/create/node_modules/express/lib/router/index.js:142:5) at Router._dispatch (/home/christian/node_modules/nave/create/node_modules/express/lib/router/index.js:170:5) at Object.router (/home/christian/node_modules/nave/create/node_modules/express/lib/router/index.js:33:10) at next (/home/christian/node_modules/nave/create/node_modules/express/node_modules/connect/lib/proto.js:190:15) at Object.methodOverride [as handle] (/home/christian/node_modules/nave/create/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js:49:5)
现在当我尝试运行它时,终端输出:
/home/christian/node_modules/nave/create/node_modules/express/lib/application.js:173 if ('function' != typeof fn) throw new Error('callback function required'); ^ 错误:需要回调函数 at Function.app.engine (/home/christian/node_modules/nave/create/node_modules/express/lib/application.js:173:38) at Function.(/home/christian/node_modules/nave/create/app.js:26:9) at Function.app.configure (/home/christian/node_modules/nave/create/node_modules/express/lib/application.js:392:61) at Object. (/home/christian/node_modules/nave/create/app.js:23:5) at Module._compile (module.js:456:26) at Object.Module._extensions..js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Function.Module.runMain (module.js:497:10) at startup (node.js:119:16)
非常感谢帮助。
问题的原因是在配置Express应用时,没有在`app.configure`函数中进行所有的`app.set`和`app.use`操作。解决方法是将这些操作放在`app.configure`函数中进行配置。具体的解决方法如下:
app.configure(function(){ app.set('port', process.env.PORT || 3000); app.set('view engine', 'ejs'); app.engine('.html', require('ejs').renderFile()); app.use(express.favicon()); app.use(express.logger('dev')); app.use(express.bodyParser()); app.use(express.methodOverride()); app.use(app.router); app.use(express.static(path.join(__dirname, 'public'))); // 只在开发环境下启用 if ('development' == app.get('env')) { app.use(express.errorHandler()); } });
根据Express官方文档所说,这些函数并不是必须的,可以直接使用`app.set()`和其他配置方法。可能在之前的版本中是必须的,但现在不再需要了。
问题的出现原因是Express期望用户在渲染视图时要么指定视图的扩展名,要么设置默认视图引擎并以该引擎的名称命名视图。
解决方法是要么在渲染视图时指定视图的扩展名,例如`res.render('index.html')`,或者在应用中设置默认视图引擎并以该引擎的名称命名视图,例如`app.set('view engine', 'ejs')`,然后使用`res.render('index')`来渲染`index.ejs`视图。
另外,如果使用`app.engine()`来设置视图引擎,需要传入一个函数引用而不是调用`renderFile()`函数。可以通过删除`renderFile`函数后面的括号来解决这个问题,例如`app.engine('.html', require('ejs').renderFile)`。
另外,如果要使用默认视图引擎,视图的扩展名应该与引擎的名称相同。例如,对于`app.set('view engine', 'ejs')`,`res.render('index')`将寻找`index.ejs`视图。否则,在渲染视图时仍然需要指定扩展名,例如`res.render('index.html')`。
最后,如果以上方法都无法解决问题,可能需要重新编写整个应用程序。