我在注册的时候,运行reg页面时候提示这个。求助
Express
500 TypeError: Cannot read property 'user' of undefined
at C:\Users\fakefish\node\mircoblog\routes\index.js:13:25
对应 index.ejs 您第一章写到的代码
//我断言到debugger;locals.posts.forEach(function(post, index){
//这行报错是Cannot call method 'forEach' of undefined
> locals
{ settings:
{ views: 'C:\\Users\\guotingchao\\Desktop\\MyBlog/views',
'view engine': 'ejs',
'x-powered-by': true,
port: 3000,
'subdomain offset': 2,
env: 'development',
'json spaces': 2,
'jsonp callback name': 'callback' },
title: '主页',
_locals: [Function],
cache: false,
filename: 'C:\\Users\\guotingchao\\Desktop\\MyBlog\\views\\index.ejs' }
//locals确实没有posts对象。 是不是因为版本问题 我使用的是 您package.json的包
很好的教程。我用了一下,发现一个问题,重启浏览器后,需要再次登录。(Chrome没有此问题,因为Chrome似乎忽略了session Max-Age) 需要在一下语句中
app.use(express.session({
secret: settings.cookieSecret,
store: new MongoStore({
db: settings.db
})
}));
加入
key: 'learnnodejs', // 你的cookie名,不要用默认的'connect.sid',因为可能被其他网站使用
cookie: {maxAge: 1000 * 60 * 60 * 24 * 30}, // 30 days
我是初学者,共勉。
render函数第一个参数是用来查找相应的EJS? 后面那个参数能传什么? 像这样的{title:login}是属于字符串,还是对象? <%- include header %> 这两边的符号是说统配 HEADER文件么? 还有什么类似的符号么?
render函数第一个参数是用来查找相应的ejs文件的,因为你用的ejs所以后缀名省略了,你当然可以这么写:res.render(‘xxx.ejs’),如果你用的jade的话也可以这么写res.render(‘xxx.jade’)。 后面那个参数传一个匿名对象,对象里是你想传入ejs文件的数据。 当然是对象了。 这是ejs的用法,还有<%= %>和<% %>,你可以先学习下ejs的使用。
collection.insert(user,{safe: true}, function(err, user){
mongodb.close();
callback(err, user);
});
SAFE TRUE 这个选项表示什么意思呀?
safe {true | {w:n, wtimeout:n} | {fsync:true}, default:false}, executes with a getLastError command returning the results of the command on MongoDB. 如果不用getLastError命令,可以删掉
@nswbmw 这有个比喻 http://cnodejs.org/topic/50367e6ff767cc9a51d2e021
大家注意到了{safe:true}这个设置了吧,作者没有说明这个{safe:true}的含义,我在这边简单介绍下。
1、不加{safe:true}表示我们mongodb客户端向数据库抛出这句insert语句后,立刻执行回调函数,而不去关心是否真的插入成功,类似往河里扔石头,扔了就告诉妈妈,我扔石头了。
2、加上{safe:true}表示mongodb数据库已经成功执行这条insert语句,并且插入完成或者报错后执行回调函数,类似往河里扔石头,看见水花起来了,或者不小心砸到河上的船了,然后告诉妈妈。
@nswbmw 跟到注册功能卡住了,貌似 session 有问题?
routes/index.js 有关 reg 的部份:
app.get('/reg', function(req,res){
res.render('reg',{
title: '注册',
user: req.session.user,
success: req.flash('success').toString(),
error: req.flash('error').toString()
});
});
app.post('/reg', function(req,res){
if(req.body['password-repeat'] != req.body['password']){
req.flash('error','两次输入的口令不一致');
return res.redirect('/reg');
}
var md5 = crypto.createHash('md5');
var password = md5.update(req.body.password).digest('base64');
var newUser = new User({
name: req.body.username,
password: password,
});
User.get(newUser.name, function(err, user){
if(user){
err = '用户已存在';
}
if(err){
req.flash('error', err);
return res.redirect('/reg');
}
newUser.save(function(err){
if(err){
req.flash('error',err);
return res.redirect('/reg');
}
req.session.user = newUser;
req.flash('success','注册成功');
res.redirect('/');
});
});
});
models/user.js:
var mongodb = require('./db');
function User(user){
this.name = user.name;
this.password = user.password;
};
module.exports = User;
User.prototype.save = function save(callback) {
var user = {
name: this.name,
password: this.password,
};
mongodb.open(function(err, db){
if(err){
return callback(err);
}
db.collection('users', function(err, collection){
if(err){
mongodb.close();
return callback(err);
}
collection.ensureIndex('name',{
unique:true
});
collection.insert(user,{safe: true}, function(err, user){
mongodb.close();
callback(err, user);
});
});
});
};
User.get = function get(username, callback){
mongodb.open(function(err, db){
if(err){
return callback(err);
}
db.collection('users', function(err, collection){
if(err){
mongodb.close();
return callback(err);
}
collection.findOne({
name: username
},function(err, doc){
mongodb.close();
if(doc){
var user = new User(doc);
callback(err, user);
} else {
callback(err, null);
}
});
});
});
};
app.js
/**
* Module dependencies.
*/
var express = require('express')
, routes = require('./routes')
, user = require('./routes/user')
, http = require('http')
, path = require('path')
, MongoStore = require('connect-mongo')(express)
, settings = require('./settings')
, flash = require('connect-flash');
var app = express();
// all environments
app.set('port', process.env.PORT || 3000);
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
app.use(flash());
app.use(express.favicon());
app.use(express.logger('dev'));
app.use(express.bodyParser());
app.use(express.methodOverride());
app.use(app.router);
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.cookieParser());
app.use(express.Session({
secret: settings.cookieSecret,
store:
new MongoStore({
db: settings.db
})
}));
// development only
if ('development' == app.get('env')) {
app.use(express.errorHandler());
}
app.use(function(req,res,next){
var err = req.flash('error');
var success = req.flash('success');
res.locals.user = req.session.user;
res.locals.error = err.length ? err : null;
res.locals.success = success.length ? success : null;
next();
});
http.createServer(app).listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});
routes(app);
错误信息:
500 TypeError: Cannot read property 'user' of undefined
at /Users/Mac/nodeprojs/blog/routes/index.js:12:30
at callbacks (/Users/Mac/nodeprojs/blog/node_modules/express/lib/router/index.js:161:37)
at param (/Users/Mac/nodeprojs/blog/node_modules/express/lib/router/index.js:135:11)
at pass (/Users/Mac/nodeprojs/blog/node_modules/express/lib/router/index.js:142:5)
at Router._dispatch (/Users/Mac/nodeprojs/blog/node_modules/express/lib/router/index.js:170:5)
at Object.router (/Users/Mac/nodeprojs/blog/node_modules/express/lib/router/index.js:33:10)
at next (/Users/Mac/nodeprojs/blog/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at Object.methodOverride [as handle] (/Users/Mac/nodeprojs/blog/node_modules/express/node_modules/connect/lib/middleware/methodOverride.js:37:5)
at next (/Users/Mac/nodeprojs/blog/node_modules/express/node_modules/connect/lib/proto.js:190:15)
at multipart (/Users/Mac/nodeprojs/blog/node_modules/express/node_modules/connect/lib/middleware/multipart.js:64:37)
@shen243212772 问题解决了,你这个教程中有个地方有错误,但你的代码是对的,app.js 文件中app.use(app.router);这句应该在取得session之后,这样就不会报错了。
请问一下, app.get('/reg’, function(req,res){ res.render('reg’,{ title: '注册’, user: req.session.user, success: req.flash(‘success’).toString(), error: req.flash(‘error’).toString() }); }); 这里的user,success,error在前台页面中使用到了吗,我发现你在前台是用的locals.user,locals.success,和locals.error取得值啊,我不明白这,大神指导下
Express 500 TypeError: Cannot set property ‘user’ of undefined at E:\study\nodejs\blog\routes\index.js:85:20 at callbacks (E:\study\nodejs\blog\node_modules\express\lib\router\index.js:161:37) at param (E:\study\nodejs\blog\node_modules\express\lib\router\index.js:135:11) at pass (E:\study\nodejs\blog\node_modules\express\lib\router\index.js:142:5) at Router._dispatch (E:\study\nodejs\blog\node_modules\express\lib\router\index.js:170:5) at Object.router (E:\study\nodejs\blog\node_modules\express\lib\router\index.js:33:10) at next (E:\study\nodejs\blog\node_modules\express\node_modules\connect\lib\proto.js:190:15) at next (E:\study\nodejs\blog\node_modules\express\node_modules\connect\lib\middleware\session.js:313:9) at E:\study\nodejs\blog\node_modules\express\node_modules\connect\lib\middleware\session.js:337:9 at E:\study\nodejs\blog\node_modules\connect-mongo\lib\connect-mongo.js:194:17 在登出的时候出现了这个错误 怎么解决啊????
这属于什么问题啊,module.js:340 throw err; ^ Error: Cannot find module ‘…/settings’ 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 Object.<anonymous> (D:\app\models\db.js:1:78) at Module._compile (module.js:456:26) at Object.Module._extensions…js (module.js:474:10) at Module.load (module.js:356:32) at Function.Module._load (module.js:312:12) at Module.require (module.js:364:17)
你好,我参考《Node.js开发指南》和你写的这个教程,遇到了问题,想请教下: locals.user/locals.error/locals.success 这几个变量只在当前页面显示,在其他页面无法获得,比如说登录时的error或success,只能在/login这个页面上显示,当重定向到主页时就不会显示了,同样的,locals.user只能在/longin页面获得,在其他页面无法获得。 不知道是什么原因,特此请教。 谢谢
@nswbmw 废弃了。。。。。。。我说看到
app.use(function(req,res,next){ var err = req.flash(‘error’), success = req.flash(‘success’); res.locals.user = req.session.user; res.locals.error = err.length ? err : null; res.locals.success = success.length ? success : null; next(); });
这里让我郁闷了半天,加了console.log()始终没有打印,最后在stackoverflow上找到了答案 http://stackoverflow.com/questions/13450228/app-use-and-app-get-or-app-post-node-js-express# 原来是要放到app.use(app.router)前面,也明白了app.use的作用就是一层层的拦截器
@shen243212772
感谢 同样的问题
var routes = require(‘./routes/router’);
routes(app);
这里是依赖参数app
如果传入在 app.use(express.session({ 之前 就会报错
而且报错不好定位
\node_modules\mongodb\lib\mongodb\connection\base.js:242
throw message;
^
Error: req.flash() requires sessions
at Error (<anonymous>)
at IncomingMessage._flash [as flash]