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); }); });
.post和.get都使用req和res作为参数调用函数,但从不使用req.那么,如果没有定义和使用或者没有在完全不同的订单中使用,该函数如何知道如何处理req或res?或者如果我给他们命名完全不同的东西?
请求和响应究竟发生了什么?对不起我的无知.我已经阅读了文档,但没有点击.
谢谢.
解决方法
所以,你的回调可能是这样定义的:
function myRouteHandler(a,b,c) { // do stuff };
或者像这样:
function myRouteHandler(req,res,next) { // stuff }
或者干脆:
function myRouteHandler() { // stuff }
无论你做什么,都无关紧要.应用程序启动时,express会侦听请求.
当其中一个匹配路由(/ some / route)时,express将在其内部工作中调用您提供的函数,如下所示:
myRouteHandler(requestObject,responSEObject,nextMiddleware);
因此,在第一种情况下,您可以使用req访问请求(例如,请求标头,完整网址,来电者IP地址或类似信息).在第二种情况下,您可以通过拨打电话来访问它.在第三种情况下,您可以使用参数[0].
按照惯例,人们将使用以下形式:myCallback(req,res)并知道Express将把请求对象作为第一个参数,并将响应作为第二个参数.响应对象实际上有一个方法end(),因此您可以结束请求.如果还有next()对象,则可以调用下一个中间件.
假设你有一个像这样定义的路线:
app.use('/api/users',checkAuthorizationHandler); app.use('/api/users',makeSureTheIPisFromOurInternalNetwork); app.use('/api/users',NowHandleTheResponse);
每个处理程序都获得第三个参数.如果你命名它,你通常在你的函数声明中称它为’next’参数.这意味着,下一个功能是有序的.
假设您的函数checkAuthorizationHandler(req,next)将检查req.headers(‘auth’)令牌,如果没有问题,它将在函数体中调用next().
然后调用函数makeSureTheIPisFromOurInternalNetwork(a,c).它将检查a.ip是否为LAN IP地址并调用c();
最后你的函数NowHandleTheResponse()将找到所有用户,并使用用户的JSON对象进行响应:arguments [1] .json([user1,user2,user3]);
所以,第一个param是表达给你的东西,它是请求,第二个是响应,第三个是下一个中间件函数.无论你怎么称呼他们,他们都在那里.
附:您还可以使用四个参数声明中间件:
function(error,req,next);
Express实际上会检查你的功能,如果它发现你有四个params而不是两个或三个,它会给你在链中早期运行的中间件抛出的任何错误.这意味着,如果你的checkAuthHandler说下一个(新的错误(‘未授权’));,你的下一个函数可能会检查该错误,如果它存在,则不给出结果.然而,检测错误的中间件通常会重新发送(‘某些错误消息’);
如果我没有把你弄糊涂,那就说,我有更多来自这里:)