作業中のアプリのバックエンドでnodejsとmongodbを使用しています。エクスプレスを使用してアプリをテストし、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エラー:ビュー「インデックス」の検索に失敗しました
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)
どんな助けも大歓迎です。
エラーの原因 は要件を説明しています。
_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
参照を期待しています。これを行うには、単に_()
_ thatcallrenderFile
を削除します。
_app.engine('.html', require('ejs').renderFile);
_
すべての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')));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
});