常见的处理程序: server.use()
原文:http://mcavage.me/node-restify/#server-api
一个的RESTify服务器有一个use() 方法,它的形式function(req, res, next) 的处理程序。需要注意的是的RESTify按顺序运行处理程序,他们被注册到服务器上,所以如果你想要一些常见的处理程序运行,在您的任何路线之前,问题需要调用 use() 在定义路由之前。
注意,在所有调用 use() 和路由下面,你可以传递任何直接组合的函数(function(req, res, next))和函数的数组 ([function(req, res, next)])。
路由
RESTify路由,在“basic”模式,是几乎等同于 express/sinatra,在HTTP动词被用于参数化资源,以确定哪些处理程序链运行。与命名占位符关联的值在req.params中是可用的。请注意,值将被URL解码在传递给你之前。
function send(req, res, next) {
res.send('hello ' + req.params.name);
return next();
}
server.post('/hello', function create(req, res, next) {
res.send(201, Math.random().toString(36).substr(3, 8));
return next();
});
server.put('/hello', send);
server.get('/hello/:name', send);
server.head('/hello/:name', send);
server.del('hello/:name', function rm(req, res, next) {
res.send(204);
return next();
});
您也可以通过用RegExp对象,并用req.params访问捕捉组(这将不以任何方式解释执行):
server.get(/^\/([a-zA-Z0-9_\.~-]+)\/(.*)/, function(req, res, next) {
console.log(req.params[0]);
console.log(req.params[1]);
res.send(200);
return next();
});
在这里,任何请求就像:
$ curl localhost:8080/foo/my/cats/name/is/gandalf
将会导致req.params[0]是foo和req.params[1]是my/cats/name/is/gandalf。基本上,你可以做任何你想要的。
注意,next() 的使用。你是负责调用next() ,为了运行下一个处理程序,在链中。如下,您可以传递一个错误的对象到有的RESTify中,自动返回响应给客户端。
您可以传入 false 而不是error,但是要停止处理程序链。如果你曾有res.send在早期的过滤器中,这不是一个错误,你可能有一个以后你想要短路,这非常有用。
最后,你可以传入一个字符串 name 传递给next(),和的RESTify会查找这个路由,并假设它存在,将在你离开链的地方运行。因此,例如:
var count = 0;
server.use(function foo(req, res, next) {
count++;
next();
});
server.get('/foo/:id', function (req, res, next) {
next('foo2');
});
server.get({
name: 'foo2',
path: '/foo/:id'
}, function (req, res, next) {
assert.equal(count, 1);
res.send(200);
next();
});
需要注意的是 foo 只得到运行一次在例子中。几个注意事项:
- 如果您提供的名称不存在,RESTify会用500响应请求。
- 别傻了,并调用这在循环中。RESTify不会检查这个。
- 最后,你不能“chain”next(’route’)调用; 你只能委托路由链一次(这是路由内部存储方式的限制,并且可能某一天重新访问)。
链处理程序
路由还可以接受多个处理函数。 例如:
server.get(
'/foo/:id',
function(req, res, next) {
console.log('Authenticate');
return next();
},
function(req, res, next) {
res.send(200);
return next();
}
);
超媒体