尝试使用 JWT 创建登录时出现“不是函数”错误
Posted
技术标签:
【中文标题】尝试使用 JWT 创建登录时出现“不是函数”错误【英文标题】:Getting a "not a function" error when trying to create a Signin with JWT 【发布时间】:2021-01-30 08:37:50 【问题描述】:免责声明:这是我第一个使用 react、mongo 和 js 的项目。我正在学习教程并尝试使其适应我的需求。
我正在尝试登录数据库,从用户那里获取一些值并返回它们,以便我知道我设法实现了连接。我知道凭据正在通过并且没问题。相反,当传递了错误的凭据时,它会按预期工作并返回错误。
我得到了 3 种状态的 reducer:请求、成功和失败。在成功和失败中,加载在更改为时都设置为 false,但是当我输入正确的凭据时,加载仍保留在屏幕上。这意味着它可能在请求验证期间卡住了。
Login Screen with XHR window
通过终端查看时,这是我在日志中得到的错误。
(node:13688) UnhandledPromiseRejectionWarning: TypeError: (0 , _util.default) 不是函数 在 _callee$ (C:\Users\Andor\Documents\GitHub\NaturaVARK\backend\routes/userRoute.js:18:16) 在 tryCatch (C:\Users\Andor\Documents\GitHub\NaturaVARK\node_modules\regenerator-runtime\runtime.js:63:40) 在 Generator.invoke [as _invoke] (C:\Users\Andor\Documents\GitHub\NaturaVARK\node_modules\regenerator-runtime\runtime.js:293:22) 在 Generator.next (C:\Users\Andor\Documents\GitHub\NaturaVARK\node_modules\regenerator-runtime\runtime.js:118:21) 在 asyncGeneratorStep (C:\Users\Andor\Documents\GitHub\NaturaVARK\backend\routes\userRoute.js:16:103) 在 _next (C:\Users\Andor\Documents\GitHub\NaturaVARK\backend\routes\userRoute.js:18:194) 在 processTicksAndRejections (internal/process/task_queues.js:93:5) 在 runNextTicks (internal/process/task_queues.js:62:3) 在 processImmediate (internal/timers.js:434:9)
我仔细检查了 userRoute.js 和 util.js。两者都与我正在关注的教程的源代码相同,为了确保可以复制和粘贴它们。问题仍然存在。引起问题的行似乎是 18 和 16,它们将是 res.send 中的令牌和电子邮件字段。我选择了代码的相关部分并放在这里,以及存储库链接,以防我可能遗漏了什么。
userRoute.js
import express from 'express';
import User from '../models/userModel';
import getToken from "../util";
const router = express.Router();
router.post('/signin', async (req, res) =>
const signinUser = await User.findOne(
email: req.body.email,
password: req.body.password,
);
if (signinUser)
res.send(
_id: signinUser.id,
name: signinUser.name,
email: signinUser.email,
isAdmin: signinUser.isAdmin,
token: getToken(signinUser),
);
else
res.status(401).send( message: 'Invalid Email or Password.' );
);
export default router;
util.js
import jwt from 'jsonwebtoken';
import config from './config';
const getToken = (user) =>
return jwt.sign(
_id: user._id,
name: user.name,
email: user.email,
isAdmin: user.isAdmin,
,
config.JWT_SECRET,
expiresIn: '48h',
);
;
export getToken ;
Github Repository
欢迎任何见解。
【问题讨论】:
【参考方案1】:由于导出的数据是对象 getToken,因此您必须将其作为对象导入。因此 getToken 变为 getToken,因为它没有作为默认值导出。要了解更多信息,请查看https://developer.mozilla.org/en-US/docs/web/javascript/reference/statements/export
试试这个:
import express from 'express';
import User from '../models/userModel';
import getToken from "../util";
const router = express.Router();
router.post('/signin', async (req, res) =>
const signinUser = await User.findOne(
email: req.body.email,
password: req.body.password,
);
if (signinUser)
res.send(
_id: signinUser.id,
name: signinUser.name,
email: signinUser.email,
isAdmin: signinUser.isAdmin,
token: getToken(signinUser),
);
else
res.status(401).send( message: 'Invalid Email or Password.' );
);
export default router;
【讨论】:
以上是关于尝试使用 JWT 创建登录时出现“不是函数”错误的主要内容,如果未能解决你的问题,请参考以下文章
尝试使用 express-jwt 阻止访问除登录页面以外的 Angular 应用程序时出现问题
将 Angular 与 JWT 的 Spring Boot 连接时出现 CORS 错误
使用 Go 向 APNS 发出推送请求时出现 403 禁止错误。我是不是正确创建了 JWT?