为什么 express 告诉我默认的视图引擎没有定义?

9 浏览
0 Comments

为什么 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)

非常感谢帮助。

0
0 Comments

问题的原因是在配置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()`和其他配置方法。可能在之前的版本中是必须的,但现在不再需要了。

0
0 Comments

问题的出现原因是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')`。

最后,如果以上方法都无法解决问题,可能需要重新编写整个应用程序。

0