在OpenShift NodeJS模板上找不到EJS模块

时间:2013-03-05 07:13:49

标签: node.js ejs openshift

我无法在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]); } };

希望这篇长篇文章能解决我的问题:)

3 个答案:

答案 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文件夹(例如expresssocket.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