尝试使用 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 创建登录时出现“不是函数”错误的主要内容,如果未能解决你的问题,请参考以下文章

放置jwt.sign代码时出现JWT错误

尝试使用 express-jwt 阻止访问除登录页面以外的 Angular 应用程序时出现问题

将 Angular 与 JWT 的 Spring Boot 连接时出现 CORS 错误

使用 Go 向 APNS 发出推送请求时出现 403 禁止错误。我是不是正确创建了 JWT?

尝试解码 Jwt 令牌时出现“尝试解码 Jwt 时发生错误:无法检索远程 JWK 集:”错误

尝试创建 Quickblox 群聊对话框,使用 REST API 登录用户时出现错误。