下面是我的auth.mjs代码:

import jwt from 'jsonwebtoken'; 

export function generateToken(userInfo){
    if(!userInfo) {
        return null;
    }
    
    const payload = { username: userInfo.username, exp: Math.floor(Date.now() / 1000) + 30}; 
    const secret = Buffer.from(process.env.JWT_SECRET).toString('base64');

    return jwt.sign(payload, secret, {algorithm: 'HS512'});
    
}

export async function verifyTokens(username, token) {
    console.error("Still inside verifyTokens");
    try{
        console.error('Inside verifyToken');
        const response = await new Promise((resolve, reject) => {
            jwt.verify(token, Buffer.from(process.env.JWT_SECRET.toString('base64'), {algorithm: 'HS512'}, (err, decoded) => {
               if (err) {
                   reject (err);
               } else {
                   resolve(decoded);
               }
            })
        )})
        
            if (response.username !== username) {
                console.error('response.username !== username');
                return {
                    verified: false,
                    message: 'invalid user'
                }
            }
            
            console.error('response.username === username');
            
            return {
                verified: true,
                message: 'verified'
            }
    } catch (error) {
        console.error('Verified Tokens Error: ' + error);
        throw {
            verified: false,
            message: 'invalid token'
        }
    }
    
}


export default generateToken;

下面是我的verify.mjs代码:

import buildResponse from '../utils/util.mjs';
import verifyTokens from '../utils/auth.mjs';


export async function verify(requestBody) {
    if(!requestBody.user || !requestBody.user.username || !requestBody.token) {
        return buildResponse(401, {
            verified: false,
            message: 'incorrect request body'
        })
    }
    
    const user = requestBody.user;
    const token = requestBody.token;
    try {
        console.error("Verifying this token=" + token);
        console.error("Verifying this user.username=" + user.username);
        const verification = await verifyTokens(user.username, token);
        console.error('Are we verified? verification.verified=', verification.verified);
        if(!verification.verified) {
            console.error("We are NOT verified! verification.verified=", verification.verified)
            return await buildResponse(401, verification);
        }
    }
    catch (error) {
        console.error("Error: ", error);
    }
   
    return buildResponse(200, {
        verified: true,
        message: 'success',
        user: user,
        token: token
    })
}

export default verify;

日志(log)文件显示我可以"验证这个令牌"和"验证这个user.username",但是日志(log)文件从来没有显示"仍然在verifyTokens内部",所以我不认为它在调用这行.

const verification = await verifyTokens(user.username, token);

enter image description here

推荐答案

Explanation:

MSN docs:

每个模块可以有两种不同类型的导出,100导出和101导出.每个模块可以有多个命名导出,但只能有一个默认导出.

使用以下语法时,您已经使用Export Declarationsauth.mjs中导出了多个命名导出,如generateTokenverifyTokens:

export function generateToken(userInfo){
   //...
}

export async function verifyTokens(username, token) {
   //...
}

这意味着在同一个文件中使用export defualt个语法可能会让人感到困惑:

export default generateToken;

通常,使用export defualt是指当您想要使用export a single variable, function or class时使用.代码中的连锁react 意味着当您这样做时:

import verifyTokens from '../utils/auth.mjs';

您刚才创建的verifyTokens变量现在实际上指向generateToken函数,因为您现在导入的是default(原来是generateToken).理解这一点很重要,因为当您try 在此处执行verifyTokens()时:

const verification = await verifyTokens(user.username, token);
console.error('Are we verified? verification.verified=', verification.verified);

实际发生的是这样的:

const verification = await generateToken(user.username, token); //< token was ignored becuase generateToken only takes one parameter
console.error('Are we verified? verification.verified=', verification.verified); //< verification.verified is undefined

Solution:

只需使用大括号将verifyTokens作为命名导出之一导入,如下所示:

import { verifyTokens } from '../utils/auth.mjs';

Node.js相关问答推荐

Express 4.18正文解析

使用NodeJS输出检索Base64图像的网络报废

如何使用NodeJS处理来自请求的单个或多个文件?

Mongoose更新许多不使用数组作为筛选器来更新记录

Puppeteer 的 BrowserFetcher 发生了什么?

Socket.io 未将用户加入给定房间

如何获取mongoose中单个id数据的记录

2023年如何在Node.js中使用Gmail发送邮箱?

为什么这个 module.export 函数如果我直接传递它就不起作用,但如果我将它包装在一个匿名函数中就可以工作

如何使用 node.js 将两个或多个 API 请求组合成一个端点并表达

我应该如何解决这个 Angular node 包模块依赖冲突?

从 Response.json() 返回的 JSON 似乎无效?

BrowserRouter 无法渲染组件

Electron 模板(Typescript + Webpack)中的这个 Electron Forge ERROR 是什么?

Express.js cookie setter 的 Domain 属性:如何与 *多个 * 域共享 cookie?

为什么在调用数据库调用时我的参数没有定义?

使用加密模块的流功能获取文件的哈希(即:没有 hash.update 和 hash.digest)

如何将使用 Gulp 的 node 部署到 heroku

在多个 .env 文件之间切换,例如 .env.development 和 node.js

'node' 未被识别为内部或外部命令