get()有3个参数,我需要一个解释 NodeJS ,express

7z5jn7bk  于 2022-12-03  发布在  Node.js
关注(0)|答案(1)|浏览(145)

我是个菜鸟。我有个问题。我用passport-google-oauth20

app.get('/auth/google/secrets',
passport.authenticate('google',{failureRedirect: '/login'}),
function(req,res){
  res.redirect('/secrets');
});

正如你可以清楚地看到,这个路由器(app.get())有3个参数,这是我第一次使用这样的东西,有人能解释一下这背后的逻辑/理论吗?
通常我使用

app.get('/somepage' , function(req,res,next){//something});

但在这种特殊情况下,有3个参数。你能为我提供任何文件,为这种特殊情况?
代码很好,我只是需要一个解释。

6uxekuva

6uxekuva1#

app.get()至少接受两个参数,如文档中所示,但您可以根据需要传递任意多个回调(一个或多个):

app.get(path, callback [, callback ...])

你传递的每个回调函数都是一个接一个地执行的,第二个回调函数直到第一个回调函数在其处理程序中调用next()时才会执行,其他回调函数依此类推。
这就允许你有一个专门针对这个路由的中间件,在你的问题中,它插入了一些中间件来要求在主请求处理程序执行之前进行身份验证。
如果认证失败,中间件会响应,不调用最后一个回调,如果认证通过,调用next(),执行最后一个回调。
下面是一个示例:

app.get("/test", 
   (req, res, next) => {
     console.log("in first handler");
     next();
}, (req, res, next) => {
     console.log("in second handler");
     next();         
}, (req, res, next) => {
     console.log("in third handler, sending response");
     // sending response and not calling next()
     res.send("ok");
}, (req, res, next) => {
     // won't ever get here
     console.log("in final handler");
     res.send("hi");
});

这显示了四个请求处理程序被传递到一个app.get()。在服务器上的调试控制台中的输出将是:

in first handler
in second handler
in third handler, sending response

并且,此请求的响应将是:

ok

第四个处理程序不会被调用,因为第三个处理程序不会调用next(),而只是对请求发送一个响应。

相关问题