错误 [ERR_HTTP_HEADERS_SENT]:在 ServerResponse.setHeader (_http_outgoing.js:518:11) 将标头发送到客户端后无法设置标头 [重
Posted
技术标签:
【中文标题】错误 [ERR_HTTP_HEADERS_SENT]:在 ServerResponse.setHeader (_http_outgoing.js:518:11) 将标头发送到客户端后无法设置标头 [重复]【英文标题】:Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client at ServerResponse.setHeader (_http_outgoing.js:518:11) [duplicate] 【发布时间】:2021-02-14 09:27:09 【问题描述】:如果我从“/search”路由中删除 else 部分,代码可以正常工作,但我还必须处理与提供的对象不匹配的请求
块引用 我不断收到此错误 错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法设置标头 在 ServerResponse.setHeader (_http_outgoing.js:518:11) 在 ServerResponse.header (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:771:10) 在 ServerResponse.send (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:170:12) 在 ServerResponse.json (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\response.js:267:15) 在 C:\Users\A\Documents\Web development\yelp kamp\dummy\app.js:47:17 在 Array.forEach () 在 C:\Users\A\Documents\Web development\yelp kamp\dummy\app.js:39:12 在 Layer.handle [as handle_request] (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\layer.js:95:5) 在下一个(C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\route.js:137:13) 在 Route.dispatch (C:\Users\A\Documents\Web development\yelp kamp\dummy\node_modules\express\lib\router\route.js:112:3)
节点服务器文件
app.use(express.json(type: ['application/json', 'text/plain']))
app.get("/",function(req,res)
res.render('index');
)
var sender = [
type: 'h',
name:'soumya'
,
type: 'i',
name:'soumyaraj'
,
type: 'j',
name:'soumyaraj'
,
type: 'k',
name:'soumyaraj'
]
app.post("/search",function(req,res)
res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Methods', 'POST');
res.setHeader('Access-Control-Allow-Headers', 'X-Requested-
With,content-type');
res.setHeader('Access-Control-Allow-Credentials', true);
var s=[];
sender.forEach(e=>
if(e.type == req.body.search)
console.log(req.body);
s.push(e);
res.json(s);
else
console.log(req.body);
res.json([
type:"notfound"
,name:"not found"
])
)
)```
<body>
<div id="myOverlay" class="overlay">
<span class="closebtn" onclick="closeSearch()" title="Close Overlay">×</span>
<div class="overlay-content">
<form action="/search" method="GET" class="frm">
<input id="inp" type="text" placeholder="Search.." name="search">
</form>
<div class="gap"></div>
<div class="result">
</div>
</div>
</div>
<h2>Fullscreen Search</h2>
<p>Click on the button to open the search box.</p>
<button class="openBtn" onclick="openSearch()">Open Search Box</button>
<script>
var show = document.getElementsByClassName("result");
function openSearch()
document.getElementById("myOverlay").style.display = "block";
function closeSearch()
document.getElementById("myOverlay").style.display = "none";
document.querySelector(".frm").addEventListener("submit", function(e)
e.preventDefault()
go(e.target[0].value);
return false;
);
document.getElementById("inp").addEventListener("input", function(e)
// if(e.target.value.length() === 0)
// show[0].textContent = "";
//
go(e.target.value);
);
function go(search)
fetch("/search",
method: 'POST',
mode: "cors",
headers:
"Content-Type": "application/json"
,
body: JSON.stringify(
search: search,
status: "find"
)
).then(function(res)
return res.json();
).then(function(data)
show[0].style.display = "block";
show[0].textContent = "";
data.forEach(e =>
show[0].innerhtml += e.type + "<br>";
show[0].innerHTML += e.name + "<br>";
);
)
</script>
</body>
【问题讨论】:
【参考方案1】:是的,这是一个非常常见的问题。请做一些研究,this question 被询问并被查看超过一百万次。您只能向客户端响应一次(意思是使用res.send()
或res.render()
或res.json()
等)。但是您在.forEach()
循环中多次响应。你不能那样做。
【讨论】:
以上是关于错误 [ERR_HTTP_HEADERS_SENT]:在 ServerResponse.setHeader (_http_outgoing.js:518:11) 将标头发送到客户端后无法设置标头 [重的主要内容,如果未能解决你的问题,请参考以下文章
为啥我不断收到“错误 [ERR_HTTP_HEADERS_SENT]:将标头发送到客户端后无法设置标头”错误?
错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到客户端后无法删除标头
Express.js 中的新 Mongoose Schema `ERR_HTTP_HEADERS_SENT` 错误
Firebase - Node.js - Express - 错误 [ERR_HTTP_HEADERS_SENT]