簡體   English   中英

NodeJS - 收到錯誤“發送后無法設置標頭”

[英]NodeJS - Getting error “Can't set headers after they are sent”

我是 node 的新手,我正在構建 rest node API。我正在使用 express 進行 HTTP 和 JWT 進行身份驗證。 每當我使用標題“x-auth”請求 /node/me 時。 它給出了下面給出的錯誤。 我已經在 /node/me 中設置了查詢 mogodb 數據庫的中間件。 它使用標題“x-auth”找到用戶

服務器.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)

你必須改成這樣:

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

原因是在執行 if 內部代碼之后,如果您發送響應,流程將獨立繼續,因為它只是一個函數調用。 所以你正在執行錯誤代碼,然后你正在執行成功代碼,我的意思是下一個函數,比如文檔是否存在,並且在next()執行時響應已經發送。

問候,

您只能使用 express 發送一個響應。 如果您遵循 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;
}

您必須導出身份驗證。 並添加返回

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM