上集说道 get 就嘎然而止 。是不是感觉有点欲罢不能 。我们这集再讲下post 以及 express 的其他用法
- 上代码 。在index.js中添加
//会返回这个请求的参数
app.post('hello',function (req,res,next) {
res.send(req.body)
});
用post man 测下 是不是通了 😄
* express
* ```
var express = require('express');
var app = express();
// 一个简单的 logger
app.use(function(req, res, next){
console.log('%s %s', req.method, req.url);
next();
});
// 响应
app.use(function(req, res, next){
res.send('Hello World');
});
挂载的路径不会在req里出现,对中间件 function
**不**可见,这意味着你在function
的回调参数req里找不到path。 这么设计的为了让间件可以在不需要更改代码就在任意"前缀"路径下执行
这里有一个实际应用场景,常见的一个应用是使用./public提供静态文件服务, 用 express.static()
中间件:
app.use(express.static(__dirname + '/public'));
app.param([name], callback)
路由参数的处理逻辑。比如当 :user
出现在一个路由路径中,你也许会自动载入加载用户的逻辑,并把它放置到 req.user
, 或者校验一下输入的参数是否正确。
下面的代码片段展示了callback
很像中间件,但是在参数里多加了一个值,这里名为id
. 它会尝试加载用户信息,然后赋值给req.user
, 否则就传递错误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'));
} });
});
另外你也可以只传一个callback
, 这样你就有机会改变 app.param()
API. 比如
express-params
定义了下面的回调,
这个允许你使用一个给定的正则去限制参数。
下面的这个例子有一点点高级,
检查如果第二个参数是一个正则,
返回一个很像上面的"user"参数例子行为的回调函数。
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');
} } }});
这个函数现在可以非常有效的用来校验参数,或者提供正则捕获后的分组。
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){
// ...});
有些模板引擎没有遵循这种转换, 这里有一个小项目[consolidate.js](https://github.com/visionmedia/consolidate.js) 专门把所有的node流行的模板引擎进行了包装,这样它们在Express内部看起来就一样了。
var engines = require('consolidate');
app.engine('haml', engines.haml);
app.engine('html', engines.hogan);
如果要详细资料 可以访问
[看这里](http://expressjs.jser.us/3x_zh-cn/api.html)
> 这里需要补充的是 关于express的 req这个参数的一些知识,以及res.send() res.sendfile(),res.render()
>下节会讲数据库 mongodb相关
网友评论