上集說(shuō)道 get 就嘎然而止 。是不是感覺(jué)有點(diǎn)欲罷不能 。我們這集再講下post 以及 express 的其他用法
- 上代碼 。在index.js中添加
//會(huì)返回這個(gè)請(qǐng)求的參數(shù)
app.post('hello',function (req,res,next) {
res.send(req.body)
});
用post man 測(cè)下 是不是通了 ??
* express
* ```
var express = require('express');
var app = express();
// 一個(gè)簡(jiǎn)單的 logger
app.use(function(req, res, next){
console.log('%s %s', req.method, req.url);
next();
});
// 響應(yīng)
app.use(function(req, res, next){
res.send('Hello World');
});
掛載的路徑不會(huì)在req里出現(xiàn),對(duì)中間件 function
**不**可見(jiàn),這意味著你在function
的回調(diào)參數(shù)req里找不到path。 這么設(shè)計(jì)的為了讓間件可以在不需要更改代碼就在任意"前綴"路徑下執(zhí)行
這里有一個(gè)實(shí)際應(yīng)用場(chǎng)景,常見(jiàn)的一個(gè)應(yīng)用是使用./public提供靜態(tài)文件服務(wù), 用 express.static()
中間件:
app.use(express.static(__dirname + '/public'));
app.param([name], callback)
路由參數(shù)的處理邏輯。比如當(dāng) :user
出現(xiàn)在一個(gè)路由路徑中,你也許會(huì)自動(dòng)載入加載用戶(hù)的邏輯,并把它放置到 req.user
, 或者校驗(yàn)一下輸入的參數(shù)是否正確。
下面的代碼片段展示了callback
很像中間件,但是在參數(shù)里多加了一個(gè)值,這里名為id
. 它會(huì)嘗試加載用戶(hù)信息,然后賦值給req.user
, 否則就傳遞錯(cuò)誤next(err)
.
app.param('user', function(req, res, next, id){
User.find(id, function(err, user){
if (err) {
next(err); }
else if (user) {
req.user = user;
next();
} else {
next(new Error('failed to load user'));
} });
});
另外你也可以只傳一個(gè)callback
, 這樣你就有機(jī)會(huì)改變 app.param()
API. 比如
express-params
定義了下面的回調(diào),
這個(gè)允許你使用一個(gè)給定的正則去限制參數(shù)。
下面的這個(gè)例子有一點(diǎn)點(diǎn)高級(jí),
檢查如果第二個(gè)參數(shù)是一個(gè)正則,
返回一個(gè)很像上面的"user"參數(shù)例子行為的回調(diào)函數(shù)。
app.param(function(name, fn){
if (fn instanceof RegExp) {
return function(req, res, next, val){
var captures;
if (captures = fn.exec(String(val))) {
req.params[name] = captures; next();
} else {
next('route');
} } }});
這個(gè)函數(shù)現(xiàn)在可以非常有效的用來(lái)校驗(yàn)參數(shù),或者提供正則捕獲后的分組。
app.param('id', /^\d+$/);
app.get('/user/:id', function(req, res){
res.send('user ' + req.params.id);
});
app.param('range', /^(\w+)..(\w+)?$/);
app.get('/range/:range', function(req, res){
var range = req.params.range;
res.send('from ' + range[1] + ' to ' + range[2]);
});
app.render(view, [options], callback)
//配合模版引擎 更酸爽
app.render('email', function(err, html){
// ...});
app.render('email', { name: 'Tobi' }, function(err, html){
// ...});
有些模板引擎沒(méi)有遵循這種轉(zhuǎn)換, 這里有一個(gè)小項(xiàng)目[consolidate.js](https://github.com/visionmedia/consolidate.js) 專(zhuān)門(mén)把所有的node流行的模板引擎進(jìn)行了包裝,這樣它們?cè)贓xpress內(nèi)部看起來(lái)就一樣了。
var engines = require('consolidate');
app.engine('haml', engines.haml);
app.engine('html', engines.hogan);
如果要詳細(xì)資料 可以訪(fǎng)問(wèn)
[看這里](http://expressjs.jser.us/3x_zh-cn/api.html)
> 這里需要補(bǔ)充的是 關(guān)于express的 req這個(gè)參數(shù)的一些知識(shí),以及res.send() res.sendfile(),res.render()
>下節(jié)會(huì)講數(shù)據(jù)庫(kù) mongodb相關(guān)