我无法在NodeJS上使用EJS作为我的视图渲染引擎。
我发现了几个类似的问题,但都说明了安装真正适用于其他人的EJS。这对我来说不一样,可能是因为我无法为安装选择正确的目录(在OpenShift repo中有如此多的重复项)。
我有OpenShift模板创建的NodeJS默认应用程序。在安装EJS依赖时,我以某种方式搞砸了它,我得到了以下错误(不可用模块的标准NodeJS错误):
Error: Cannot find module 'ejs' at Function._resolveFilename (module.js:337:11) at Function._load (module.js:279:25) at Module.require (module.js:359:17) at require (module.js:375:17) at View.templateEngine (/usr/lib/node_modules/express/lib/view/view.js:134:38) at Function.compile (/usr/lib/node_modules/express/lib/view.js:68:17) at ServerResponse._render (/usr/lib/node_modules/express/lib/view.js:417:18) at ServerResponse.render (/usr/lib/node_modules/express/lib/view.js:318:17) at /var/lib/openshift/5123c2494382ec16ca000222/app-root/runtime/repo/server.js:114:17 at callbacks (/usr/lib/node_modules/express/lib/router/index.js:272:11)
除了在package.json中提到之外,我还尝试通过终端在app-root,runtime和nodejs-0.6级别安装ejs(并重新启动应用程序),但没有用。
我的目录结构是:
-app-root ---data ---repo -----node_modules (has ejs) -----server.js -----package.json ("dependencies": {"ejs" : ">=0.8.3"},) -----views -------defaultError.ejs ---runtime -----data -----node_modules (empty) -----repo (identical to app-root/repo) -------node_modules (has ejs) -nodejs-0.6 ---data ---repo (identical to app-root/repo) -----node_modules (has ejs) ---runtime -----node_modules (empty) -----repo (identical) -------node_modules (has ejs)
defaultError.ejs只是简单的html。 server.js有以下内容:
self.createRoutes = function() {
self.routes = { };
//...
self.routes['/'] = function(req, res) {
res.setHeader('Content-Type', 'text/html');
res.send(self.cache_get('index.html') );
};
self.routes['/helloejs'] = function(req, res){
res.render('defaultError', { layout:false } );
};
};
self.initializeServer = function() {
self.createRoutes();
self.app = express.createServer();
self.app.set('view engine', 'ejs');
// Add handlers for the app (from the routes).
for (var r in self.routes) {
self.app.get(r, self.routes[r]);
}
};
self.createRoutes = function() {
self.routes = { };
//...
self.routes['/'] = function(req, res) {
res.setHeader('Content-Type', 'text/html');
res.send(self.cache_get('index.html') );
};
self.routes['/helloejs'] = function(req, res){
res.render('defaultError', { layout:false } );
};
};
self.initializeServer = function() {
self.createRoutes();
self.app = express.createServer();
self.app.set('view engine', 'ejs');
// Add handlers for the app (from the routes).
for (var r in self.routes) {
self.app.get(r, self.routes[r]);
}
};
希望这篇长篇文章能解决我的问题:)
答案 0 :(得分:0)
错误是由于使用了错误的目录。您必须安装包并从项目目录运行您的应用程序。这是我用作项目的文件夹的目录结构。
.
├── app.js
├── node_modules
│ ├── express
│ ├── jade
│ └── socket.io
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
├── routes
│ ├── index.js
├── server.js
└── views
└── layout.jade
使用此文件夹中的npm install
会在node_modules子文件夹中添加package文件夹(例如express
,socket.io
)。您应该使用此位置的node
,因为只能从此文件夹中看到所有本地安装的模块。
答案 1 :(得分:0)
我的情况,我只是在 package.json 中手动添加了ejs:
{
"name": "myApp"
"dependencies": {
"express": "^4.12.2",
"ejs": "^1.0.0"
}
}
运行 npm install (可能需要使用 sudo 运行它) 请注意,默认情况下,ejs会查看目录
答案 2 :(得分:0)
安装ejs时,必须使用选项--save:
npm install ejs --save
并创建.gitignore文件:
node_modules