【问题标题】:App crashes, after the verification of jwt token应用程序崩溃,验证 jwt 令牌后
【发布时间】:2021-12-09 11:07:30
【问题描述】:

首先,我在 post 请求中添加了令牌,然后它成功地给出了响应消息“电子邮件已验证”。

Click here: to see response message

但是之后,用户的jwt令牌被验证,然后突然app崩溃并抛出错误:

node:internal/process/promises:246
          triggerUncaughtException(err, true /* fromPromise */);
          ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at new NodeError (node:internal/errors:363:5)
    at ServerResponse.setHeader (node:_http_outgoing:574:11)
    at ServerResponse.header (E:\WEB_DEV\frontend2\backend\node_modules\express\lib\response.js:771:10)
    at ServerResponse.send (E:\WEB_DEV\frontend2\backend\node_modules\express\lib\response.js:170:12)
    at ServerResponse.json (E:\WEB_DEV\frontend2\backend\node_modules\express\lib\response.js:267:15)
    at E:\WEB_DEV\frontend2\backend\middleware\authMiddleware.js:28:37
    at processTicksAndRejections (node:internal/process/task_queues:96:5) {
  code: 'ERR_HTTP_HEADERS_SENT'
}
[nodemon] app crashed - waiting for file changes before starting...

这里是令牌验证码:

const jwt = require('jsonwebtoken');
const client = require('../configs/database');

exports.verifyToken = (req, res) => {
    const token = req.headers.authorization;
    jwt.verify(token, process.env.SECRET_KEY, (err, decoded) => {
        if (err) {
            res.status(500).json({
                error: "Server error found"
            })
        }
        console.log(decoded.email);
        const userEmail = decoded.email;
        client.query(`SELECT * FROM login WHERE email = '${userEmail}'`)
            .then((data) => {
                // console.log(data);
                if (data.rows.length == 0) {
                    res.status(404).send("Token not verified");
                }
                else {
                    req.email = userEmail;
                    res.status(200).send("Email verified");
                    next();   //problem occurs here**
                }
            })
            .catch((err) => {
                if (err) {
                    res.status(500).json({
                        message: "Database error occurred",
                        error: err,
                    })
                }

            })
    })
}

应用程序崩溃的原因,“中间件工作”不显示。

const express = require('express')
const router = express.Router();
const { verifyToken } = require('../middleware/authMiddleware');
// const { addProducts } = require('../controllers/products');


router.post("/add", verifyToken, (req, res) => {
    res.send("Middleware working");
})

【问题讨论】:

    标签: node.js jwt express-jwt


    【解决方案1】:

    您不应在发送回复后使用next()

    所以这里的解决方案是在验证令牌时使用next()。所以你的 req, res 继续到 /add 路线。

    如果令牌无效,您可以像现在一样发送响应。

    所以只需删除res.status(200).send("Email verified");

    【讨论】:

    • 对,现在它正在工作,但 verifyToken 中也缺少 next ,即它应该是exports.verifyToken = (req, res,next) => {...}
    猜你喜欢
    • 2018-08-15
    • 2019-06-23
    • 2020-10-10
    • 1970-01-01
    • 2015-07-17
    • 2017-07-27
    • 2019-10-20
    • 2016-01-17
    • 2021-02-03
    相关资源
    最近更新 更多