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