节点和节点中间件中的'req'和'res'参数是什么?

rek*_*irt 3 javascript connect node.js express

我是Node和Express的新手,其他与构建带有节点requestresponse参数的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?或者如果我将它们命名为完全不同的东西

请求和响应究竟发生了什么?对不起我的无知.我已经阅读了文档,但没有点击.

谢谢.

Zla*_*tko 6

当您使用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说下一个(新的错误('未授权'));,你的下一个函数可能会检查该错误,如果它存在,则不给出结果.然而,检测错误的中间件通常会重新发送('某些错误消息');

如果我没有把你弄糊涂,那就说,我有更多来自这里:)