【一起学 Node.js (一)】用 Node + Express 搭建多人博客
发布于 2年前 作者 nswbmw 17888 次浏览 最后一次编辑是 10个月前
61 回复

为何不做成视频呢

我感觉文字教程就挺好啊,做成视频的话反而没这效果把,表示也没做过视频。。。

为什么不把代码放到github上?

会的,等我写完并整理完~

不错不错。

@nswbmw 有项目找你,qq 345357596

我在注册的时候,运行reg页面时候提示这个。求助

Express
500 TypeError: Cannot read property 'user' of undefined
at C:\Users\fakefish\node\mircoblog\routes\index.js:13:25

这是源代码,你看看哪里不一样。。。是不是user没存session? http://www.kuaipan.cn/file/id_80904329019547372.htm

@nswbmw 我发现是我把app.use(app.router);写在了session前面了。。

感谢分享,因为没有后端经验看得很辛苦,但是您写得很用心,第一章看了两天总算做出点东西来了,谢谢

Cannot call method ‘forEach’ of undefined 为什么运行报错了呢?

我记得也遇到过这个问题,forEach是数组的方法,你再瞅瞅调用forEach的是不是数组

很实用的教程

多谢!

很可能是你要foEach的对象不存在。我开始经常遇到。 最好做一次<% if (object) { %>或者<% if (object[0]) { %>的判断。

@knighterrant 天啦你居然这么快就回复我了 我还在debug中呢。。先按你的方法试试。非常感谢!

@knighterrant 对了 我是在index.ejs 的 locals.posts.forEach遇到的问题、 指向locals undefined···

对应 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

我是初学者,共勉。

受教了 :)

你看一下,index.js中callback是不是返回的数组?对比一下代码看看哪里不一样 http://www.kuaipan.cn/file/id_80904329019547372.htm

@nswbmw 嗯 代码是一样的呢 我用您的项目代码直接跑 也是这个错的。

@guotingchaopr 是不是没有npm install?

@nswbmw npm install 了 我感觉这个是代码内部的错误 应该不是少了某个moudel

非常棒啊 书上那个做到注册那儿我就实在作不下去了 一步一步跟着你这个来

我的工程目录底下没有models这个文件夹,请问这个文件夹是一开始express的时候生成的,还是install mongoDB后生成的?

自己新建的~

就要你这个文章呀…………市面上的全都过时了。

render函数第一个参数是用来查找相应的EJS? 后面那个参数能传什么? 像这样的{title:login}是属于字符串,还是对象? <%- include header %> 这两边的符号是说统配 HEADER文件么? 还有什么类似的符号么?

@nswbmw 原来是这样,谢谢!

render函数第一个参数是用来查找相应的ejs文件的,因为你用的ejs所以后缀名省略了,你当然可以这么写:res.render(‘xxx.ejs’),如果你用的jade的话也可以这么写res.render(‘xxx.jade’)。 后面那个参数传一个匿名对象,对象里是你想传入ejs文件的数据。 当然是对象了。 这是ejs的用法,还有<%= %>和<% %>,你可以先学习下ejs的使用。

@ggaaooppeenngg 没资料。。自己摸索的。。。

        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)

环境:node v0.10.5, express: 3.2.4

@Juanito 这些代码是没问题。我用的node 0.10.6 express 3.2.4测试成功啊?你把错误的代码打包发我邮箱[email protected]我看看哪里出错了

@nswbmw 是的,看到好几个都报Cannot read property ‘user’ of undefined 这个错误,我的也是

@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取得值啊,我不明白这,大神指导下

locals.user 等同于 user ,可以用 user 取代,其余一样。。我改下,历史遗留问题。。

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 在登出的时候出现了这个错误 怎么解决啊????

咱可以私聊不,有好多纠结的地方,这样说好麻烦啊,我qq :601692043 请加我下。。。。。。。

这属于什么问题啊,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页面获得,在其他页面无法获得。 不知道是什么原因,特此请教。 谢谢

此教程废弃了。。新的在这:https://github.com/nswbmw/N-blog

@nswbmw 解决了,十分感谢

@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的作用就是一层层的拦截器

出现了乱码应该怎么设置呢?表示才学Nodejs

@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]

搭建多人博客初期出错,mongodb服务建立好了后,运行app还是会出现ERROr:connecting to database,是什么原因呢?

@nswbmw Procfile文件是指后缀名为Procfile的文件还是?

感谢分享 作为一个初学者 很实用

回到顶部