nodejs学习过程中遇到的一些难点整理

1. app.use

app.use 加载用于处理http請求的middleware(中间件),当一个请求来的时候,会依次被这些 middlewares处理
app.use顺序执行

注意:app.use注册的中间件,如果path参数为空,则默认为”/”,而path为”/”的中间件默认匹配所有的请求。

//定义自己的中间件
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err); //next函数主要是用来确保所有注册的中间件被一个接一个的执行,那么我们就应该在所有的中间件中调用next函数,但有一个特例,如果我们定义的中间件终结了本次请求,那就不应该再调用next函数
}); 

Express 框架的 API,说白了就是钩子链。
app.use([path, ]hook)
app.get(path[, hook1, hook2, hook3, …], handler)

任何一个钩子,只要调用了 res.end()(或者 res.send()、res.render() 之类最终会调用 res.end() 的方法)后,就将内容返回给用户,中断后续的钩子;如果调用 next() 则把请求传递给下一个钩子,一直传递到最后的 handler。

2. req.flash

function checkLogin(req, res, next){
    if(!req.session.user){
         //flash 实际就是一个用一次就删除(就是说只引用一次,第二次引用该值就没有了)的变量而已…跟普通的变量一样.
         //只要把相应的变量传递到模板引擎即可.
         req.flash('error','未登录');
         return res.redirect('/login');
    }
    next();
}

前端ejs中引用:

<% if(success) {%>
         <div class='successMsgCls'><%= success %></div>
<% } %>
<% if(error) {%> 
         <div class='errorMsgCls'><%= error %></div>
<% } %>   

3. nodejs + mongodb数据库 代码片段

db.js:

var settings = require('../settings'),
    Db = require('mongodb').Db,
    Connection = require('mongodb').Connection,
    Server = require('mongodb').Server;

module.exports = new Db(settings.db, new Server(settings.host,settings.port),{safe:true});  

user.js:

var mongodb = require('./db'); //数据库对象
var crypto = require('crypto');

function User(user){
    this.name = user.name;
    this.password = user.password;
    this.email = user.email;
};

module.exports = User;

//store user info 对象方法
User.prototype.save = function(callback){
     var md5 = crypto.createHash('md5');

     var email_MD5 = md5.update(this.email.toLowerCase()).digest('hex'),
        head = "http://www.gravatar.com/avatar/" + email_MD5 + "?s=48";

     var user = {
        name:this.name,
        password:this.password,
        email:this.email,
        head:head
     };   

     //open database
     mongodb.open(function(err,db){
          if(err){
              return callback(err);
          }

           // read user collection
          db.collection('users',function(err,collection){
                 if(err){
                    mongodb.close();
                    return callback(err);
                 }    
                 console.log("insert user: ");
                 console.log(user);


                 collection.insert(user,{safe:true},function(err,result){
                        mongodb.close();
                        if(err){
                            return callback(err);
                        }

                        console.log("insert success result: ");
                        console.log(result);

                        callback(null, result["ops"][0]);// success, return the saved user document
                 });//insert
          });//collection
     });
};

// read info by name
User.get = function(name,callback){
       mongodb.open(function(err,db){
           if(err){

               return callback(err);
           }

            console.log("find user name: ");
                 console.log(name);

           db.collection('users',function(err,collection){
               if(err){
                    db.close();
                    return callback(err);
               }  

               collection.findOne(
                     {name:name},
                     function(err,user){
                        mongodb.close();

                        if(err){
                            return callback(err);  // fail, return err
                        }

                        callback(null, user);// success, return result
                     }

                )//findOne
           });
       })//open db
};

4. req取参数的3种方法

参考 http://i5ting.github.io/node-http/#106
expressjs里的请求参数,4.x里只有3种

req.params
req.body
req.query
已经废弃的api

req.param(Deprecated. Use either req.params, req.body or req.query, as applicable.)
(1) req.params

app.get('/user/:id', function(req, res){
  res.send('user ' + req.params.id);
});

俗点:取带冒号的参数

(2) req.body

Contains key-value pairs of data submitted in the request body. By default, it is undefined, and is populated when you use body-parsing middleware such as body-parser and multer.

This example shows how to use body-parsing middleware to populate req.body.

var app = require('express')();
var bodyParser = require('body-parser');
var multer = require('multer'); 

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

app.post('/', function (req, res) {
  console.log(req.body);
  res.json(req.body);
})

可以肯定的一点是req.body一定是post请求,express里依赖的中间件必须有bodyParser,不然req.body是没有的。

详细的说明在下面的3种post用法里。

(3). req.query

query是querystring

说明req.query不一定是get

// GET /search?q=tobi+ferret
req.query.q
// => "tobi ferret"

// GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order
// => "desc"

req.query.shoe.color
// => "blue"

req.query.shoe.type
// => "converse"
因为有变态的写法

// POST /search?q=tobi+ferret
{a:1,b:2}
req.query.q
// => "tobi ferret"

post里看不的,用req.body取。

简而言之,
req.params获取pathinfo中参数 /api/users/{id}
req.query获取查询参数 /api/users?name=wwx
req.body获取form提交参数

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值