node.js express开发web问题
1、新建的layout.ejs,在里面使用了<%= title %>,但是在运行时提示title is not defined。
将title改为<%= locals.title %>即可
2、在使用session进行连接mongodb数据库时,出现错误 (引用http://winfan.net/662.html)
Error: Most middleware (like session) is no longer bundled with Express and must be installed separately.
在express 4.0之前的版本,像session之类的中间件是伴随express自动安装的,网上有的教程使用的express版本正是4.0之前的版本,所以在使用4.0及其之后版本的时候一定要注意这点。
用的时候不在使用express.session,而是直接使用session():
app.use(session({ secret:setting.cookieSecret, key:setting.db, cookie:{maxAge:1000*60*60*24*30}, store:new MongoStore({db:setting.db}) }));
1 { 2 "name": "appName", 3 "version": "0.0.1", 4 "private": true, 5 "scripts": { 6 "start": "node ./bin/www" 7 }, 8 "dependencies": { 9 "express": "~4.2.0", 10 "static-favicon": "~1.0.0", 11 "morgan": "~1.0.0", 12 "cookie-parser": "~1.0.1", 13 "body-parser": "~1.0.0", 14 "mongodb": "*", 15 "express-useragent": "*", 16 "connect": "*", 17 "cookie-session": "*", 18 "cookies": "*", 19 "express-session": "~1.0.4" 20 } 21 }
3、前端ejs页面访问session中内容
在app.js中插入如下代码:(在express早期版本中为helper,dynamicHelpers),注意下面代码要放在路由之前,否则不识别其中的变量
1 app.use(function(req,res,next){ 2 // res.locals.user = req.session ? req.session.user:''; 3 // res.locals.keyword = req.session ? req.session.keyword:''; 4 5 res.locals.user = req.session.user; 6 res.locals.post = req.session.post; 7 var error = req.flash('error'); 8 res.locals.error = error.length ? error : ''; 9 10 var success = req.flash('success'); 11 res.locals.success = success.length ? success : ''; 12 next(); 13 });
后端代码如下,
var newUser = new User({ name: req.body.username, password: password, }); //檢查用戶名是否已經存在 User.get(newUser.name, function(err, user) { if (user) err = 'Username already exists.'; if (err) { // req.flash('error', err); console.log( err); return res.redirect('/reg'); } //如果不存在則新增用戶 newUser.save(function(err) { if (err) { // req.flash('error', err); req.session.error='用户不存在'; console.log('error', err); return res.redirect('/reg'); } req.session.user = newUser; // req.flash('success', '註冊成功'); req.session.success='注册成功'; console.log('注册成功'); res.redirect('/'); }); });
如果在前端ejs中访问User对象的name或password属性,可以使用<%= locals.user['name']%> <%= locals.user['password']%>
req.flash在express4.X后使用的话,需要单独安装,并引入。