Модуль EJS не найден в шаблоне OpenShift NodeJS

Я не могу использовать EJS в качестве движка рендеринга представления на NodeJS.

Я нашел несколько похожих вопросов, но все они говорят об установке EJS, которые действительно работают для других. Для меня это не то же самое, может быть, потому что я не могу выбрать правильный каталог (среди множества дубликатов в репозитории OpenShift) для установки.

У меня есть приложение NodeJS по умолчанию, созданное с помощью шаблона OpenShift. При установке зависимости 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, я попытался установить ejs через терминал на уровне app-root, runtime и nodejs-0.6 (и перезапустить приложение), но без толку.

Моя структура каталогов:

-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]);
        }
    };

Надеюсь, этот длинный пост проясняет мою проблему :)


person Traze    schedule 05.03.2013    source источник


Ответы (3)


Ошибка связана с использованием неправильного каталога. Вам необходимо установить пакеты и запустить приложение из каталога вашего проекта. Вот структура каталогов папки, которую я использую в качестве проекта.

.
├── 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 (например, express, socket.io). Вы должны использовать node из этого места, так как все локально установленные модули видны только из этой папки.

person user568109    schedule 05.03.2013
comment
Упомянутая мною структура каталогов поддерживается платформой OpenShift, так что она может стандартным образом управлять циклом сборки / развертывания. Как я вижу, эта структура тоже похожа на вашу. Хотя здесь много повторяющихся репо / каталогов, которые я потерял. Я также попытался установить каталог ejs app-root / runtime / и app-root / runtime / repo (каталог, указанный в исходной трассировке ошибки). - person Traze; 05.03.2013
comment
Я не уверен в точной причине, но вот как моя проблема исчезла: я добавил экспресс в package.json. Это очень странно, поскольку экспресс-установка по умолчанию доступна для всех приложений в OpenShift. Отметка правильного ответа выше, поскольку он, по крайней мере, обеспечивает необходимую контрольную точку. - person Traze; 09.03.2013

В моем случае я просто добавил ejs вручную в package.json:

 {
   "name": "myApp"
   "dependencies": {
     "express": "^4.12.2",
     "ejs": "^1.0.0"
   }
 }

И запустите npm install (возможно, вам нужно запустить его с помощью sudo). Обратите внимание, что по умолчанию ejs просматривает каталог просмотров.

person levon    schedule 05.03.2015

при установке ejs вы должны использовать опцию --save:

npm install ejs --save

и создайте файл .gitignore:

node_modules
person IT Vlogs    schedule 16.12.2016