在express3下实现《node.js开发指南》中的microblog需要注意的几个问题:
1.express3.0默认不支持layout模板,解决办法如下:
step 1:安装 express-partial
1
|
npm
install
express-partials
|
step 2:修改package.json里面的dependencies,添加"express-partials": "*",并执行一下命令获得最新版
1
|
npm
install
|
step 3:在 app.js 中使用 express-partial
1
2
|
var
partials = require(
'express-partials'
);
app.use(partials());
|
OK,到此就可以正常使用 layout.ejs 了
2.mongodb连接错误,解决办法:
1
|
var
MongoStore = require(
'connect-mongo'
)(express);
|
ps.注意阅读 connect-mongo 中的 Readme.md 文件中的说明
3. app.use(express.router(routes)); 报方法错误,解决办法如下:
1
2
3
4
5
6
7
8
9
10
|
app.configure(
function
(){
app.set(
'views'
, __dirname +
'/views'
);
/*...*/
/*注意下面两行内容*/
//app.use(express.router(routes));
app.use(app.router);
app.use(express.static(__dirname +
'/public'
));
});
routes(app);
//这个是新加的
|
使用 app.use(app.router) 和 routes(app) 替代 app.use(express.router(routes))
4. flash 方法错误,express3也不再默认支持 flash方法,需要另外安装 connect-flash,方法如下:
1
|
npm
install
connect-flash
|
在app.js中使用:
1
2
3
4
|
var
flash = require(
'connect-flash'
);
app.configure(
function
(){
app.use(flash());
});
|
当然,个人觉得基本上可以不需要使用flash,而采用session方式直接代替亦可,方法参考后文中关于session部分
5. dynamicHelpers 方法错误,express3也不再支持dynamicHelpers方法,解决办法如下:
1
2
3
4
5
6
7
8
|
app.use(
function
(req, res, next){
res.locals.user = req.session.user;
res.locals.err = req.session.error;
// console.log("err" , req.session.error);
next();
});
|
该处注意几个地方:res.locals可以理解成是client端的全局变量,而req.session则可以理解成是server端的全局变量。
所以,在可以直接在 routes/index.js 中这么写:
1
|
req.session.error =
'两次输入的密码不同'
;
|
而在用于client页面渲染用的 views/layout.ejs 模板中这么写即可:
1
2
3
|
<%
if
(err) { %>
<%= err %>
<%}%>
|
注意: err 及 error 分别是client端(res.locals)和server端(req.session)中的局部变量。
6. NODE_ENV设置方法:
windows xp下载cmd中使用命令set进行全局设置:
1
|
set
NODE_ENV=production
|
通过以下代码查看当前运行的模式:
1
|
console.log(
"Express server listening in %s mode"
, app.settings.env);
|
通过以上代码也可以看出,所谓的模式其实也只是一个node.js中app的setting中的一个属性值,所以我们可以通过以下代码在单独的应用中设置,且优先级是最高的(相当于局部变量):
1
2
3
4
5
6
7
8
|
// 设置node.js的运行环境为 production
app.set(
"env"
,
'production'
);
//app.set("env" , 'development');
// development only
if
(
'development'
== app.get(
'env'
)) {
app.use(express.errorHandler());
}
|
7. cluster 中现成关闭事件监听的问题:
1
2
3
4
5
6
7
|
// 书中的 death 无效,需要使用 exit
cluster.on(
'exit'
,
function
(worker) {
// 当一个子进程结束的时候,重新启动一个新的子进程
delete
workers[worker.pid];
worker = cluster.fork();
workers[worker.pid] = worker;
});
|