为什么Express告诉我默认视图引擎未定义?

15

我在开发一个应用程序时,使用了nodejs和mongodb作为后端。我正在使用express进行测试,并尝试使用ejs来渲染我的html文件。但是,我遇到了默认视图引擎未定义的问题。

以下是我的app.js代码:

/**
* Module dependencies.
*/
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;
// all environments
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')));
// development only
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 server listening on port ' + 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');
                                 ^
Error: callback function required
    at Function.app.engine (/home/christian/node_modules/nave/create/node_modules/express/lib/application.js:173:38)
    at Function.<anonymous> (/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.<anonymous> (/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)

非常感谢您的帮助。


你尝试过使用 "ejs": "*" 来查看是否存在奇怪的版本问题吗? - kentcdodds
你已经执行了 npm install -d 命令了吗? - kentcdodds
最好提供错误的副本。 - Loourr
我确实执行了npm install -d命令,我将尝试安装"ejs": "*"。 - Christian Grabowski
2个回答

34

错误来源描述了以下要求:

if (!ext && !this.defaultEngine) throw new Error('No default engine was specified and no extension was provided.');

Express希望您使用扩展名指定视图:

res.render('index.html');

或者指定一个默认视图引擎并以其命名您的视图:

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

// `res.render('index')` renders `index.ejs`

关于你的编辑:
if ('function' != typeof fn) throw new Error('callback function required');
问题出在这一行:
app.engine('.html', require('ejs').renderFile());

正如文档所示, app.engine() 需要一个 function 引用。您可以通过简单地删除 () 中的 调用 renderFile 来实现:

app.engine('.html', require('ejs').renderFile);

@ChristianGrabowski 对于设置默认视图引擎,您似乎已经放置在正确的位置。不过,您添加的错误是另一个问题。请参见我的编辑。 - Jonathan Lonowski
是的,那个修复了,但现在Express又给我一个新的错误,我已经在上面更新了。 - Christian Grabowski
@ChristianGrabowski 要使用默认引擎,视图扩展名应该为引擎的名称。因此,对于 app.set('view engine', 'ejs'),则 res.render('index') 将查找 index.ejs。否则,在渲染时仍需指定预期的扩展名 -- res.render('index.html') - Jonathan Lonowski
我没有使用 res.render(index),这是必需的吗?还是只用 app.engine('.html', require('ejs').renderFile) 就可以了? - Christian Grabowski
@ChristianGrabowski res.render('index') 只是一个例子,因为您没有包括如何在 ./routes/index.js./routes/user.js 中使用 res.render()。但是,只要在渲染时包括扩展名 res.render('index.html'),使用 app.engine('.html', ...) 就可以了。 - Jonathan Lonowski
好的,感谢你的帮助,但我最终还是从头开始重写了整个app.js文件,现在它可以工作了。不过我确实使用了你的一些建议,所以我会把答案归功于你。 - Christian Grabowski

2

需要在 app.configure 中完成所有的 app.setapp.use 操作。

尝试使用以下代码:

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')));
    // development only
    if ('development' == app.get('env')) {
        app.use(express.errorHandler());
    }
});

1
这些函数现在不再是使用app.set()和其他配置方法所必需的。 也许它曾经是必需的,但现在不是了。 - Jonathan Lonowski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接