我收到了"Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client"



我第一次使用Node.js和Express来制作API,但我遇到了一些问题
我正在使用Node。JS 13.11.0和Express 4.17.1
当我尝试访问127.0.0.1:4008/api/nbhbdm并附加参数时,我收到了此错误。

_http_outgoing.js:535
throw new ERR_HTTP_HEADERS_SENT('set');
^
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:535:11)
at ServerResponse.header (/Users/zihangu/Desktop/TZG API/nbhbdm/node_modules/express/lib/response.js:771:10)
at ServerResponse.send (/Users/zihangu/Desktop/TZG API/nbhbdm/node_modules/express/lib/response.js:170:12)
at ServerResponse.json (/Users/zihangu/Desktop/TZG API/nbhbdm/node_modules/express/lib/response.js:267:15)
at exports.XMLHttpRequest.httpRequest.onreadystatechange (/Users/zihangu/Desktop/TZG API/nbhbdm/app.js:28:17)
at exports.XMLHttpRequest.dispatchEvent (/Users/zihangu/Desktop/TZG API/nbhbdm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:591:25)
at setState (/Users/zihangu/Desktop/TZG API/nbhbdm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:610:14)
at IncomingMessage.<anonymous> (/Users/zihangu/Desktop/TZG API/nbhbdm/node_modules/xmlhttprequest/lib/XMLHttpRequest.js:440:13)
at IncomingMessage.emit (events.js:315:20)
at IncomingMessage.Readable.read (_stream_readable.js:508:10) {
code: 'ERR_HTTP_HEADERS_SENT'
}
Process exited with code 1

以下是我的代码。

const express = require('express');
const app = express();
app.all('*', function(req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
res.header("X-Powered-By",'3.2.1');
res.header("Content-Type", "application/json;charset=utf-8");
next();
});
app.get('/api/nbhbdm',function(req,res,err){
console.log(req.query);
var keyword = encodeURI(encodeURI(req.query.keyword));
var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
var httpRequest = new XMLHttpRequest();
httpRequest.open('GET', "https://suo.im/api.htm?&key=000000000000&expireDate=2030-03-31&url=https://abcdef.cn/?s=" + keyword, true);
httpRequest.send();
httpRequest.onreadystatechange = function () {
if (httpRequest.readyState == 4 && httpRequest.status == 200) {
var result = httpRequest.responseText;
console.log(result);
res.json({"status":"ok","slink":result,"nlink":https://abcdef.cn/?s=" + encodeURI(req.query.keyword)});
}
else{
res.json({"status":"error","slink":"connection error","nlink":https://abcdef.cn/?s=" + encodeURI(req.query.keyword)});
}
}
})
var server = app.listen(4008, '127.0.0.1', function(){
var host = server.address().address;
var port = server.address().port;
console.log("Server running at http://%s:%s", host, port);
})

我看到错误:在将标头发送到客户端后无法设置标头,但我认为我没有尝试对同一请求发送多个响应
我能知道我的代码哪里出错了吗?

我看到错误:在将标头发送到客户端后无法设置标头,但我认为我没有尝试向同一请求发送多个响应。

你有,只是没有注意到。

onreadystatechange事件触发四次(1-4(,一次对于readyState中的每个变化。

来源:https://www.w3schools.com/js/js_ajax_http_response.asp

每次触发onreadystatechange,并且readyState不是4或状态不是200时,您都会尝试使用res.json((向客户端发送一个响应。由于无法向同一请求发送多个响应,因此会引发错误。

您需要onreadystatechange回调来忽略任何不是4的readystate,然后根据请求的状态采取行动:

httpRequest.onreadystatechange = function () {
if (httpRequest.readyState !== 4)
return;
if (httpRequest.status == 200) {
var result = httpRequest.responseText;
console.log(result);
res.json({"status":"ok","slink":result,"nlink":https://abcdef.cn/?s=" + encodeURI(req.query.keyword)});
}
else{
res.json({"status":"error","slink":"connection error","nlink":https://abcdef.cn/?s=" + encodeURI(req.query.keyword)});
}
}
const User = require('../models/users')
const mongoose = require('mongoose')
here i am importing mongoose and user Schema it works for me
module.exports = {
checkAuthenticated:(req,res,next)=>{  // Check User Authentication
if(req.isAuthenticated()){
return next()
}
res.redirect('/login')
}
}

//如果你的checkAuthenticated函数在不同的文件中,那么请确保你已经导入了User Schema和Mongoose

相关内容

最新更新