我在注册的时候,运行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]