rek*_*irt 3 javascript connect node.js express
我是Node和Express的新手,其他与构建带有节点request
和response
参数的Web应用程序相关的层实际上让我感到困惑.我的困惑在于这两个参数通常存在于函数中,但通常不会声明其中的一个或两个.此外,大多数情况下会抛出一个额外的参数,比如'next'
或其他什么.例如,我有一个API的以下路由器:
router.route('/teams')
// create a team at POST http://localhost:8080/api/teams
.post(function(req, res) {
var team = new Team();
team.name = req.body.name;
team.location = req.body.location;
// save the new team and check for errors
team.save(function(err) {
if (err) {
res.send(err);
};
res.json({ message: 'Team created!' });
});
})
// GET all the teams at GET http://localhost:8080/api/teams
.get(function(req, res) {
Team.find(function(err, teams){
if (err) {
res.send(err);
};
res.json(teams);
});
});
Run Code Online (Sandbox Code Playgroud)
双方.post
并.get
调用一个函数req
,并res
作为参数,但req
从未使用过.那么,如果没有定义和使用或者没有在完全不同的订单中使用,该函数如何知道如何处理req或res?或者如果我将它们命名为完全不同的东西
请求和响应究竟发生了什么?对不起我的无知.我已经阅读了文档,但没有点击.
谢谢.
当您使用expressApp.use('/some/route', myRouteHandler);
Express时,将侦听该路由的请求,当它被命中时,它将调用您提供的功能(回调).它将为它提供三个参数:请求和响应,以及下一个.(实际上可能是四个,但让事情变得简单.)
所以,你的回调可能是这样定义的:
function myRouteHandler(a, b, c) {
// do stuff
};
Run Code Online (Sandbox Code Playgroud)
或者像这样:
function myRouteHandler(req, res, next) {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
或者干脆:
function myRouteHandler() {
// stuff
}
Run Code Online (Sandbox Code Playgroud)
无论你做什么,都无关紧要.应用程序启动时,express会侦听请求.
当其中一个匹配route(/some/route
)时,express将在其内部工作中调用您提供的函数,如下所示:
myRouteHandler(requestObject, responseObject, nextMiddleware);
Run Code Online (Sandbox Code Playgroud)
因此,在第一种情况下,您可以使用req访问请求(例如,请求标头,完整网址,来电者IP地址或类似信息).在第二种情况下,您可以通过拨打电话来访问它.在第三种情况下,您可以使用参数[0].
按照惯例,人们将使用以下形式:myCallback(req, res)
并且知道Express会将请求对象作为第一个参数,并将响应作为第二个参数.响应对象实际上有一个方法end(),因此您可以结束请求.如果还有next()对象,则可以调用下一个中间件.
假设你有一个像这样定义的路线:
app.use('/api/users', checkAuthorizationHandler);
app.use('/api/users', makeSureTheIPisFromOurInternalNetwork);
app.use('/api/users', nowHandleTheResponse);
Run Code Online (Sandbox Code Playgroud)
每个处理程序都获得第三个参数.如果你命名它,你通常在你的函数声明中称它为'next'参数.这意味着,下一个功能是有序的.
假设您function checkAuthorizationHandler(req, res, next)
将检查req.headers('auth')令牌,如果没问题,它将在函数体中调用next()
.
然后function makeSureTheIPisFromOurInternalNetwork(a, b, c)
被称为.它将检查a.ip是否为LAN IP地址并进行呼叫c();
最后,您function nowHandleTheResponse()
将找到所有用户,并使用用户的JSON对象进行响应: arguments[1].json([user1, user2, user3]);
所以,第一个param是表达给你的东西,它是请求,第二个是响应,第三个是下一个中间件函数.无论你怎么称呼他们,他们都在那里.
PS你也可以用四个参数声明你的中间件:
function(error, req, res, next);
Run Code Online (Sandbox Code Playgroud)
Express实际上会检查你的功能,如果它发现你有四个params而不是两个或三个,它会给你在链中早期运行的中间件抛出的任何错误.这意味着,如果你的checkAuthHandler说下一个(新的错误('未授权'));,你的下一个函数可能会检查该错误,如果它存在,则不给出结果.然而,检测错误的中间件通常会重新发送('某些错误消息');
如果我没有把你弄糊涂,那就说,我有更多来自这里:)
归档时间: |
|
查看次数: |
7956 次 |
最近记录: |