提问者:小点点

如何打印jwt令牌


我试图生成一个jwt令牌,并在用户经过身份验证后通过调用res.json()将其打印出来,问题是我得到了以下错误:

Cannot set headers after they are sent to the client

我尝试使用asyncawait来解决这个问题,但仍然给出了错误。我怎样才能成功地将。json应用于我的令牌?

下面是我的Node.js服务器:

const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const cors = require('cors');
const mongoose = require('mongoose');
require('dotenv').config();
const BASE_URL = process.env.BASE_URL;
const PORT = process.env.PORT || 1337;
const jwt = require('jsonwebtoken');
let Post = require('./models/post.model.js');

app.use(cors());
app.use("/assets", express.static(__dirname + "/assets"));
app.use(bodyParser.urlencoded({ extended: true }));

mongoose.connect(BASE_URL, { useNewUrlParser: true, useUnifiedTopology: true })

const connection = mongoose.connection;

connection.once('open', function () {
    console.log('Connection to MongoDB established succesfully!');
});

app.set('view-engine', 'ejs');

app.get('/', (req, res) => {
    res.render('index.ejs');
});

app.post('/', (req, res) => {
    let username = req.body.username;
    let password = req.body.password;

    if (username !== process.env.USER_NAME && password !== process.env.USER_PASSWORD) {
        res.json('Invalid credentials');

    } else {
        const token = jwt.sign({
            username: username,
            password: password
        }, process.env.SECRET_KEY, {
            expiresIn: '1h'
        });

        res.redirect('/dashboard');
        res.json(token);
    }
});

app.get('/dashboard', (req, res) => {
    res.render('dashboard.ejs');
});

app.get('/dashboard/createPost', (req, res) => {
    res.render('post.ejs');
});

app.post('/dashboard/createPost', async (req, res) => {
    let collection = connection.collection(process.env.POSTS_WITH_TAGS);
    res.setHeader('Content-Type', 'application/json');
    let post = new Post(req.body);
    collection.insertOne(post)
        .then(post => {
            res.redirect('/dashboard')
        })
        .catch(err => {
            res.status(400).send(err);
        });
});

app.listen(PORT);

共1个答案

匿名用户

您正在调用res.redirect('/dashboard');之前的res.json(令牌);,您不能发送两次响应,这就是为什么它会给您“发送后不能设置头”错误。

相反,您可以通过重定向将令牌作为查询发送,如下所示:

res.redirect(`/dashboard?token=${token}`);

然后通过查看查询值,就可以从前端app中获取token值。

虽然这不是一个非常安全的方法