NodeJS - Получение сообщения об ошибке «Не удается установить заголовки после их отправки» - PullRequest
0 голосов
/ 06 мая 2018

Я новичок в узле, и я создаю API остальных узлов. Я использую экспресс для HTTP и JWT для аутентификации. Всякий раз, когда я запрашиваю / узел / меня с заголовком "x-auth". Это дает ошибку, которая приведена ниже. Я установил промежуточное ПО в / 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}`);
})

authenticate.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)

Ответы [ 3 ]

0 голосов
/ 06 мая 2018

Вы можете отправить только один ответ с экспресс. Если вы проследите за серией событий в промежуточном программном обеспечении Authenticate, вы обнаружите, что отправляете ответ с:

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

, а затем позвонить next(). Когда вы вызываете next, он передает управление следующему промежуточному программному обеспечению, которое затем отправляет:

res.send(req.user);

Вырежьте next() из цикла при сбое запроса с чем-то вроде:

if(!doc){
    res.status(401).send('doc is not found');
    return;
}
0 голосов
/ 06 мая 2018

Вы должны экспортировать аутентификацию. И добавить возврат

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();
    }
0 голосов
/ 06 мая 2018

Вы должны перейти на это:

if(!doc){

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

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

Причина в том, что после выполнения внутреннего кода if поток продолжается независимо, если вы отправляете ответ, потому что это просто вызов функции. Итак, вы выполняете код ошибки, и после этого вы выполняете код succes, я имею в виду следующую функцию, например, если документ существует, и в момент выполнения next () ответ был отправлен.

С уважением,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...