[英]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.