错误[ERR_HTTP_HEADERS_SENT]:无法在将标头发送到客户端后设置标头 - Express + Request
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了错误[ERR_HTTP_HEADERS_SENT]:无法在将标头发送到客户端后设置标头 - Express + Request相关的知识,希望对你有一定的参考价值。
我知道这是一个非常基本的问题,但我发现自己花了太多时间来理解为什么会这样。
下面是api,其中我使用npm请求lib来查询api,我发送带有快速响应的响应。当我点击这个时,我得到:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:470:11)
at ServerResponse.header (C:UsersGayathriGanesanDocumentssampleNode
ode_modulesexpresslib
esponse.js:767:10)
at ServerResponse.send (C:UsersGayathriGanesanDocumentssampleNode
ode_modulesexpresslib
esponse.js:170:12)
at ServerResponse.json (C:UsersGayathriGanesanDocumentssampleNode
ode_modulesexpresslib
esponse.js:267:15)
at Request._callback (C:UsersGayathriGanesanDocumentssampleNodeapp.js:80:34)
at Request.self.callback (C:UsersGayathriGanesanDocumentssampleNode
ode_modules
equest
equest.js:185:22)
at Request.emit (events.js:189:13)
at Request.<anonymous> (C:UsersGayathriGanesanDocumentssampleNode
ode_modules
equest
equest.js:1161:10)
at Request.emit (events.js:189:13)
at IncomingMessage.<anonymous> (C:UsersGayathriGanesanDocumentssampleNode
ode_modules
equest
equest.js:1083:12)
下面是编写的代码。
var express = require('express');
var app = express();
var request=require("request");
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept,clientSecret");
res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,PATCH,DELETE,OPTIONS');
next();
});
app.post("/push/v1/apps/:appID/devices",function(req,response){
var appID=req.params.appID;
var options={
url:"https://pushapp.sampleapp.net/push/v1/apps/"+appID+"/devices",
headers:{
'Content-Type':req.headers["content-type"],
'clientSecret':req.headers["clientsecret"]
},
body: JSON.stringify(req.body)
}
request.post(options,function(err,res,body){
if(res.statusCode==201){
response.sendStatus(201).json(JSON.parse(body));
}
else{
response.sendStatus(res.statusCode);
}
});
});
你能帮忙理解为什么吗?我可以猜测回调发生了两次。但不确定如何。
答案
问题是res.sendStatus
设置给定的响应HTTP状态代码并将其字符串表示作为响应主体发送(请参阅documentation)。 res.json
将设置内容类型响应标头,但在时间响应将已经发送到客户端。
因此,您可以简单地使用res.sendStatus
而不是使用res.status
:
response.status(201).json(JSON.parse(body));
以上是关于错误[ERR_HTTP_HEADERS_SENT]:无法在将标头发送到客户端后设置标头 - Express + Request的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?
错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法删除标头
Express.js 中的新 Mongoose Schema `ERR_HTTP_HEADERS_SENT` 错误
Firebase - Node.js - Express - 错误 [ERR_HTTP_HEADERS_SENT]