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提交参数