【问题标题】:next is not a function. Nodejs http://localhost:3000/api/authenticatenext 不是函数。 Nodejs http://localhost:3000/api/authenticate
【发布时间】:2019-10-17 15:27:27
【问题描述】:

我正在使用 jwt 和护照开发平均应用程序登录/注册。使用本地存储我正在保存令牌,但它没有保存在本地存储中。 它还在我的controller.js 中说next is not a function。另一方面,注册工作非常好。

contoller.js

   module.exports.authenticate = (req, res, next) => {
    // call for passport authentication
    passport.authenticate('local', (err, user, info) => {       
        // error from passport middleware
        if (err) return res.status(400).json(err);
        // registered user
        else if (user) return res.status(200).json({ "token": 
     user.generateJwt() });
        // unknown user or wrong password
        else return res.status(404).json(info);
    })(req, res);
   }

index.router.js

const express = require('express');
const router = express.Router();

const ctrlUser = require('../controllers/user.controller');

const jwtHelper = require('../config/jwtHelper');

router.post('/register', ctrlUser.register);
router.post('/authenticate', ctrlUser.authenticate);
router.get('/profile',jwtHelper.verifyJwtToken, ctrlUser.userProfile);

module.exports = router;

login.component.ts

onSubmit(form : NgForm){
    this.userService.login(form.value).subscribe(
      res => {
        this.userService.setToken(res['token']);
        this.router.navigateByUrl('/profile');
      },
      err => {
        this.serverErrorMessages = err.error.message;
      }
    );
  }

用户.服务


  login(authCredentials){
    return this.http.post(environment.apiBaseUrl+'/authenticate', authCredentials, this.noAuthHeader);
  }


  setToken(token: string) {
    localStorage.setItem('token', token);
  }

  getToken() {
    return localStorage.getItem('token');
  }

  deleteToken() {
    localStorage.removeItem('token');
  }

  getUserPayload() {
    var token = this.getToken();
    if (token) {
      var userPayload = atob(token.split('.')[1]);
      return JSON.parse(userPayload);
    }
    else
      return null;
  }

  isLoggedIn() {
    var userPayload = this.getUserPayload();
    if (userPayload)
      return userPayload.exp > Date.now() / 1000;
    else
      return false;
  }

  getUserProfile() {
    return this.http.get(environment.apiBaseUrl + '/profile');
  }
TypeError: next is not a function
    at attempt (D:\fulinkedFolder\flogin\backend\node_modules\passport\lib\middleware\authenticate.js:186:32)
    at authenticate (D:\fulinkedFolder\flogin\backend\node_modules\passport\lib\middleware\authenticate.js:362:7)
    at module.exports.authenticate (D:\fulinkedFolder\flogin\backend\controllers\user.controller.js:37:7)
    at Layer.handle [as handle_request] (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\layer.js:95:5)
    at next (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\route.js:137:13)
    at Route.dispatch (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\route.js:112:3)
    at Layer.handle [as handle_request] (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\layer.js:95:5)
    at D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:281:22
    at Function.process_params (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:335:12)
    at next (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:275:10)
    at Function.handle (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:174:3)
    at router (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:47:12)
    at Layer.handle [as handle_request] (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\layer.js:95:5)
    at trim_prefix (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:317:13)
    at D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:284:7
    at Function.process_params (D:\fulinkedFolder\flogin\backend\node_modules\express\lib\router\index.js:335:12)

【问题讨论】:

    标签: node.js api jwt passport.js restful-authentication


    【解决方案1】:

    next 函数与reqres 一起传递:

    module.exports.authenticate = (req, res, next) => {
      passport.authenticate('local', (err, user, info) => {
    
        // ...
    
      })(req, res, next) // Pass 'next' here
    }
    

    我希望这会有所帮助。

    【讨论】:

    • 已解决,但现在提供Error: Unknown authentication strategy "local"。这里passport.authenticate('local', (err, user, info) =>
    • 你在passport.use(new LocalStrategy( ... ))注册本地策略了吗?
    • 谢谢,我忘了在app.js 中包含passportConfig 文件!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 2019-07-07
    • 2010-12-01
    • 1970-01-01
    • 2021-03-11
    • 2018-11-22
    • 1970-01-01
    相关资源
    最近更新 更多