另一个 "can't set headers after they're sent"
Another "can't set headers after they're sent"
我收到 "can't set headers after they're sent" 错误,据我所知,这可能是由于我的服务器不止一次发送响应,但我的代码似乎并非如此,至少在表面。我查询 dbpedia 以获得一些资源,然后将其发回给我的客户。这是代码:
app.get("/",function(req,res,next){
if (req.query.titolo){
var response ;
let [ artist, title ] = getArtistTitle(req.query.titolo);
title = title.replace(" ","_");//for dbpedia resource names
const prefixes = {
dbo: "http://dbpedia.org/ontology/",
db: "http://dbpedia.org/resource/"
}
DbPediaClient.setOptions('application/sparql-results+json',prefixes);
DbPediaClient.query("SELECT ?abstract WHERE { db:"+title+
" dbo:abstract ?abstract. FILTER langMatches(lang(?abstract),'en') }")
.then((data)=>{
response = data["results"]["bindings"][0]["abstract"]["value"] ;
return res.json({abstract: response}) ;
})
.catch((error)=>{
console.log(error);
});
}
});
我使用 virtuoso-sparql-client 查询 http://dbpedia.org/sparql(DbPediaClient 在此函数之外初始化)。我已经尝试使用 res.send 而不是 res.json,但它仍然给出相同的错误。顺便说一下,它是这样的:
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/node_modules/express/lib/response.js:170:12)
at DbPediaClient.query.then (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/server.js:43:15)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
如果您需要更多信息,请询问。
Express 是一个处理 request/response 循环的框架,它通过迭代匹配 HTTP 请求中指定路径的路由并让您的代码在每个匹配中发送响应或调用 next()
如果它没有'发送一个。这里的问题是您有以下问题:
app.get("/",function(req,res,next){
res.sendFile(...);
next();
});
app.get("/",function(req,res,next){
if (req.query.titolo){
...
res.json(...);
}
});
这段代码表示
Whenever I get an HTTP request to /
then send some HTML, then if the request contains titolo
in the query, send some JSON as well.
Express 告诉您不能再发送任何东西,因为您已经发送了 HTML。
一个解决方案是将 API 路线移动到 HTML:
上方
app.get("/",function(req,res,next){
if (req.query.titolo){
...
res.json(...);
} else {
next();
}
});
app.get("/",function(req,res){
res.sendFile(...);
});
这意味着
Whenever I get an HTTP request to /
, if the request contains titolo
in the query, send some JSON, otherwise send some HTML.
但我的建议是将 API 路由移动到不与静态文件的路由冲突的不同路径,这对于 HTTP 服务器来说更为典型。
我收到 "can't set headers after they're sent" 错误,据我所知,这可能是由于我的服务器不止一次发送响应,但我的代码似乎并非如此,至少在表面。我查询 dbpedia 以获得一些资源,然后将其发回给我的客户。这是代码:
app.get("/",function(req,res,next){
if (req.query.titolo){
var response ;
let [ artist, title ] = getArtistTitle(req.query.titolo);
title = title.replace(" ","_");//for dbpedia resource names
const prefixes = {
dbo: "http://dbpedia.org/ontology/",
db: "http://dbpedia.org/resource/"
}
DbPediaClient.setOptions('application/sparql-results+json',prefixes);
DbPediaClient.query("SELECT ?abstract WHERE { db:"+title+
" dbo:abstract ?abstract. FILTER langMatches(lang(?abstract),'en') }")
.then((data)=>{
response = data["results"]["bindings"][0]["abstract"]["value"] ;
return res.json({abstract: response}) ;
})
.catch((error)=>{
console.log(error);
});
}
});
我使用 virtuoso-sparql-client 查询 http://dbpedia.org/sparql(DbPediaClient 在此函数之外初始化)。我已经尝试使用 res.send 而不是 res.json,但它仍然给出相同的错误。顺便说一下,它是这样的:
Error: Can't set headers after they are sent.
at validateHeader (_http_outgoing.js:491:11)
at ServerResponse.setHeader (_http_outgoing.js:498:3)
at ServerResponse.header (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/node_modules/express/lib/response.js:767:10)
at ServerResponse.send (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/node_modules/express/lib/response.js:170:12)
at DbPediaClient.query.then (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/server.js:43:15)
at <anonymous>
at process._tickCallback (internal/process/next_tick.js:188:7)
如果您需要更多信息,请询问。
Express 是一个处理 request/response 循环的框架,它通过迭代匹配 HTTP 请求中指定路径的路由并让您的代码在每个匹配中发送响应或调用 next()
如果它没有'发送一个。这里的问题是您有以下问题:
app.get("/",function(req,res,next){
res.sendFile(...);
next();
});
app.get("/",function(req,res,next){
if (req.query.titolo){
...
res.json(...);
}
});
这段代码表示
Whenever I get an HTTP request to
/
then send some HTML, then if the request containstitolo
in the query, send some JSON as well.
Express 告诉您不能再发送任何东西,因为您已经发送了 HTML。
一个解决方案是将 API 路线移动到 HTML:
上方app.get("/",function(req,res,next){
if (req.query.titolo){
...
res.json(...);
} else {
next();
}
});
app.get("/",function(req,res){
res.sendFile(...);
});
这意味着
Whenever I get an HTTP request to
/
, if the request containstitolo
in the query, send some JSON, otherwise send some HTML.
但我的建议是将 API 路由移动到不与静态文件的路由冲突的不同路径,这对于 HTTP 服务器来说更为典型。