除非包装在箭头函数中,否则方法不会返回正确的结果

时间:2018-09-06 03:26:05

标签: javascript node.js function express middleware

在我的Node / Express API中,为了保护我的路线,我是passport.authenticate

app.get('/', passport.authenticate('jwt', { session: false}), (req, res) => { //whatever })

我在这些路由上还有其他中间件,而且它变得相当长,并且我不想在所有路由器文件中都要求通行证,因此在一个单独的文件中,我在一个称为protect的现有身份验证对象上创建了另一种方法

const auth = {
   protect() {}
}

这允许我这样做

app.get('/', auth.protect, (req, res) => { //whatever })

最初,我尝试返回passport.authenticate

const auth = {
   protect() {
      return passport.authenticate('jwt', { session: false})
   }
}

但这无效

然后我将其包装在箭头函数中

const auth = {
    protect() {
       () => passport.authenticate('jwt', { session: false})
    }
}

现在,当我在路线上致电auth.protect时,它就可以正常工作。

另外,如果我只是导出箭头功能

export const protect = () => {
   return passport.authenticate('jwt', { session: false})
}

当我在路线上致电protect时,此方法也适用。

为什么我需要返回带有我要运行的代码的箭头函数,为什么当我在路线上调用函数时,第一个带有return的示例不起作用?

2 个答案:

答案 0 :(得分:3)

第一个示例似乎返回函数执行的结果,第二个示例返回函数。

答案 1 :(得分:1)

Wktrf赚钱了。详细说明:app.get()需要两个参数,一个路径和一个回调函数。 http://expressjs.com/en/api.html#app.get

.container-fluid {
  padding: 0em 10em;
}

.h1 {
  margin-bottom: 35px;
  box-shadow: 0 5px 5px -5px #333;
  color: #70aeb6;
}

a.photo-container>img {
  margin-bottom: 50px;
  transition: transform .2s ease-in-out;
}

a.photo-container {
  text-decoration: none;
  position: relative;
  display: inline-block;
}

a.photo-container:active>img {
  transform: scale(1.4);
}

上面的返回passport.auth的结果。但是,需要一个函数作为app.get()的参数。

<!DOCTYPE html>
<html lang="es-MX">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <link rel="shortcut icon" type="image/png" href="https://via.placeholder.com/16x16" />
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous">
  <link rel="stylesheet" href="css/styles.css">
  <title>Gallery</title>
</head>

<div class="container-fluid">
  <div class="h1 text-center">
    Classmates gallery
  </div>

  <div class="d-block">
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
    <a href="#" class="photo-container">
      <img src="https://via.placeholder.com/300x200">
    </a>
  </div>
</div>

</html>

第二个示例返回一个函数:const auth = { protect() { return passport.authenticate('jwt', { session: false}) } } 然后可以使用哪个app.get()。

希望这会有所帮助。