【发布时间】:2018-09-27 22:37:39
【问题描述】:
我收到“发送后无法设置标头”错误,我知道这可能是由于我的服务器多次发送响应造成的,但我的代码似乎并非如此,至少在表面上。我向 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)
如果您需要更多信息,请询问。
【问题讨论】:
-
除了这条路线,还有其他路线可以匹配
"/"吗? -
if (req.query.titolo){是否有更多的条件同时为真,例如if(...){} if(...){}? -
@PatrickRoberts 在此之前还有一个。
app.get("/",function(req,res,next){ //console.log(req.query); res.sendFile(path + "index.html"); next(); }); -
@Plutone11011 这就是问题所在。你总是
res.sendFile()。所以您已经发送了 HTML,现在您正尝试在同一个请求/响应周期中发送 JSON,这表示您不能。 -
@vibhor1997a 我不这么认为,但我不确定你的意思。该条件用于检查 get 查询中包含的特定属性。基本上我希望这个中间件只响应客户端的特定 ajax 请求。