1. 程式人生 > >nodejs學習過程中遇到的一些難點整理

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種方法

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提交引數