NodeJS - 获取错误“无法在发送后设置标头”

时间:2018-05-06 06:04:44

标签: javascript node.js express

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

server.js:

var a = [1,2];
var b = [3,4];
var c = [5,6,7];
var d = [...a, ...b, ...c];
// resulting array will be like d = [1,2,3,4,5,6,7]

authenticate.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}`);
})

我收到有关标题的错误

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);

}) 

3 个答案:

答案 0 :(得分:0)

您必须更改为:

if(!doc){

    res.status(401).send('doc is not found');

} else {
    req.token = token;
    req.user = doc;
    next();
}

原因是在执行if内部代码之后,如果您发送响应,则流程将独立继续,因为它只是一个函数调用。因此,您正在执行错误代码,之后您正在执行成功代码,我的意思是下一个函数,如果文档存在,并且在next()执行时,响应已被发送。

此致

答案 1 :(得分:0)

您只能使用快递发送一个回复。如果您遵循Authenticate中间件中的一系列事件,您将发现您正在发送响应:

res.status(401).send('doc is not found');

然后调用next()。当你接下来打电话时,它会将控制权传递给下一个中间件,然后发送:

res.send(req.user);

当请求失败时,将next()从环路中删除,例如:

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

答案 2 :(得分:0)

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



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();
    }