首页 > 解决方案 > NodeJS - 收到错误“发送后无法设置标题”

问题描述

我是 node 新手,我正在构建 rest node API。我使用 express 进行 HTTP 和 JWT 进行身份验证。每当我使用标头“x-auth”请求 /node/me 时。它给出了下面给出的错误。我在 /node/me 中设置了查询 mogodb 数据库的中间件。它使用标头“x-auth”找到用户

server.js:

var env = process.env.NODE_ENV || 'development';
if (env === "development") {
    process.env.PORT = 3000;
    process.env.MONGODB_URI = 'mongodb://localhost:27017/TodoApp';
} else if (env === "test") {
    process.env.PORT = 3000;
    process.env.MONGODB_URI = 'mongodb://localhost:27017/TodoAppTest';
}
var _ = require('lodash');
var express = require('express');
var bodyParser = require('body-parser');
var {ObjectID} = require('mongodb');
var app = express();

var {mongoose} = require('./db/mongoose');
var {Todo} = require('./models/todo');
var {User} = require('./models/user');
const {authenticate} = require('./middleware/authenticate');
const bcrypt = require('bcryptjs');
const port = process.env.PORT;

app.use(bodyParser.json());
app.get('/users/me',authenticate,(req,res) => {
    res.send(req.user);
});
module.exports = {
    app,
    env
}

app.listen(port,() => {
    console.log(`server is running ${port}`);
});

验证.js:

const {User} = require('./../models/user');
var authenticate = (req,res,next) => {
var token = req.header('x-auth');
User.findByToken(token).then((doc) => {
    if (!doc) {
       res.status(401).send('doc is not found');
    }
    req.token = token;
    req.user = doc;
    next();
}).catch((e) => {
    res.status(401).send(e);
});

我收到有关标题的此错误

 Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:494:11)
    at ServerResponse.setHeader (_http_outgoing.js:501:3)
    at ServerResponse.header (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\response.js:719:10)
    at ServerResponse.send (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\response.js:164:12)
    at app.get (C:\Users\Yash\Desktop\node-api\server\server.js:254:5)
    at Layer.handle [as handle_request] (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\router\layer.js:95:5)
    at next (C:\Users\Yash\Desktop\node-api\node_modules\express\lib\router\route.js:131:13)
    at User.findByToken.then (C:\Users\Yash\Desktop\node-api\server\middleware\authenticate.js:19:2)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)

标签: javascriptnode.jsexpress

解决方案


您必须导出身份验证。并添加返回

if(!doc) {
    res.status(401).send('doc is not found');
    return;
}

或添加其他

if(!doc) {
    res.status(401).send('doc is not found');
  } else {
      req.token = token;
      req.user = doc;
      next();
}

推荐阅读