index.js
var express = require(‘express’);
var app = express();
app.set(‘views’, __dirname); app.set(‘view engine’, ‘ejs’);
app.get(’/’, function(req, res){ res.render(‘page’); });
app.listen(8888, function(){ console.log(‘asd’); });
page.ejs
<html>
<body>
<h1>Supplies</h1>
<ul>
<% for(var i=0; i<supplies.length; i++) {%>
<li><%= supplies[i] %></li>
<% } %>
</ul>
</body>
</html>
报错
Error: Cannot find module 'ejs’ at Function.Module._resolveFilename (module.js:338:15) at Function.Module._load (module.js:280:25) at Module.require (module.js:364:17) at require (module.js:380:17) at new View (D:\tools\nodejs\node_modules\express\lib\view.js:43:49) at Function.app.render (D:\tools\nodejs\node_modules\express\lib\application.js:509:12) at ServerResponse.res.render (D:\tools\nodejs\node_modules\express\lib\response.js:900:7) at D:\tools\nodejs\nodetest\ejslesson2\index.js:12:7 at Layer.handle [as handle_request] (D:\tools\nodejs\node_modules\express\lib\router\layer.js:82:5) at next (D:\tools\nodejs\node_modules\express\lib\router\route.js:100:13)
步骤 npm init npm install ejs --save expressjs是全局的。 麻烦各位看看谢谢了
顶一下,各位老师帮忙看看,谢谢了
package.json { “dependencies”:{ “express” : “~4.0.0”, “ejs” : “*” } } index.js var express = require(‘express’); var app = express(); app.set(‘views’, __dirname); app.set(‘view engine’, ‘ejs’);
var supplies = [‘hello’,‘world’]; app.get(’/’, function(req, res){ res.render(‘page’,{supplies:supplies}); });
app.listen(8888, function(){ console.log(‘asd’,{}); }); 其他不变。 现在这个目录下执行npm install, 然后node index.js,就可以了。
你的npm install ejs --save这个命令应该没有在项目目录下执行,所以告诉你找不到ejs模块。 这个命令执行成功后,你会在项目目录下看到一个node_modules目录,里面包含一个ejs目录。
@eeandrew 您好老师,我是有 npm install ejs --save 的, 我的express 之前安装的是-g,所以在package.json 中没有express,而后我又在这个项目目录下, 重新npm install express --save , 此时,package.json 中有express依赖,然后运行node index.js 运行正常了。 我想请问一下,为什么之前-g了,还需要在此项目加入这个全局的依赖?那全局的有什么作用? 麻烦了
@servanter 你把npm的全局安装和局部安装混合使用,一般不会有问题,但是在特殊情况下会发生问题,刚好你就碰到了。 先说解决方法吧
- express和ejs都通过npm局部安装,就是不使用-g
- express和ejs都通过npm全局安装,就是说使用-g
npm找依赖包的过程是现在同级node_modules目录下找,然后在父目录的node_modules下找,最后在NODE_PATH指定的目录下找,如果都没找到,报错: not found
但是这不能说明为什么找不到ejs, 因为你通过npm install ejs把ejs安装在项目目录下了。那按照上面的理论应该可以找到,为啥实际还是报错呢?
这时你看看的index.js文件,我们没有这样的语句: var ejs = require(‘ejs’)。因为这是不需要的。找ejs不是我们的工作,而是express自己的工作。 那express是怎么去找ejs的呢?看源代码。
this.engine = engines[ext] || (engines[ext] = require(ext.slice(1)).__express);
看到那个require了吗。现在懂了吧。express自己通过require找ejs,那么ejs就只能在express的同级目录,或者父目录,或者NODE_PATH里面。
还想玩吗?把express和ejs都删除,然后在你的项目目录运行npm install express,再运行npm install ejs -g。看看会发生什么
@eeandrew 非常深刻!谢谢老师
@eeandrew 大神级回复,扫盲了~