node.js - next 不是函数。Nodejs http://localhost:3000/api/authenticate
问题描述
我正在使用 jwt 和护照开发平均应用程序登录/注册。使用本地存储我正在保存令牌,但它没有保存在本地存储中。它还next is not a function
在我的controller.js
. 另一方面,注册工作非常好。
控制器.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;
登录组件.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)
解决方案
next
将函数与req
and一起传递res
:
module.exports.authenticate = (req, res, next) => {
passport.authenticate('local', (err, user, info) => {
// ...
})(req, res, next) // Pass 'next' here
}
我希望这有帮助。
推荐阅读
- json - 如何让 sqlachemy 看到 json_each 或 jsonb_each 中的隐式横向连接?
- javascript - 在 useEffect 中未正确设置 React ref
- drupal - Drupal 8 中的 Swetalert 表单
- python - Python re.sub 如何将字符串中的每个 0 替换为 2 当旁边没有 1 时?
- json - 从 GitHub Actions 中的 JSON 文件中获取变量的名称
- javascript - 为什么我的 JSON 对象键的值未定义?
- json - 防止在 GET http 请求 url 中对 ID 进行数字排序
- c# - 我们可以在透明窗口上应用着色器吗
- javascript - 打字稿 - 检查参数组合是否为空
- google-calendar-api - 从同意屏幕谷歌中删除“永久删除”权限