gpt4 book ai didi

node.js - 为什么这条 Express 路线会多次触发?

转载 作者:太空宇宙 更新时间:2023-11-04 01:37:11 25 4
gpt4 key购买 nike

我有一个从客户端页面调用的服务器路由,如下所示:

$.get("/feed", {
feedurl: feedUrl,
dataType: 'json'
}, function() {
$feedBody.empty();
}).fail(function(error) {
console.log('ERROR!!');
}).done(function(data) {
...
}

这是路线的代码:

router.get('/feed', function(req, res) {

console.log('getFeed (%s)', req.query.feedurl);

var myreq = request(req.query.feedurl);

myreq.on('error', function(error) {
console.log('DNS Error (%s) [%s]',req.query.feedurl, error.message);
res.send({error:error.message});
})
.on('response', function(response) {
console.log('RESPONSE (%s) [%s]', req.query.feedurl, JSON.stringify(response));

if (response.statusCode == 200) {

getFeed(req.query.feedurl, function (err, feedItems, feedTitle, feedLink) {
if (feedItems) {
try {
console.log('Sending (%s) - %s', req.query.feedurl, new Date().getTime());
res.send({
feedItems: feedItems,
feedLink: feedLink,
feedTitle: feedTitle
});
} catch(err) {
console.log('ERROR in SEND try / catch (%s) (%s)', req.query.feedurl, err);
}

} else {
res.send({error:err});
}

});

}
});
});

它工作得很好,除非它不工作:现在,在特定的 URL(显然是 gzip 编码的 RSS 提要,但这不是真正的重点)上,提要被发送回客户端几次(3!)次,触发可怕的“发送后无法设置 header ”。错误。现在,我无法将错误消息发送回客户端。

以下是上述代码运行时的输出:

2019-01-15 14:23: getFeed (http://rss.nytimes.com/services/xml/rss/nyt/World.xml)
2019-01-15 14:23: Sending (http://rss.nytimes.com/services/xml/rss/nyt/World.xml) - 1547558586803

如果没有:

2019-01-15 14:31: getFeed (https://www.rollingstone.com/music/rss)
2019-01-15 14:31: Sending (https://www.rollingstone.com/music/rss) - 1547559093110
2019-01-15 14:31: Sending (https://www.rollingstone.com/music/rss) - 1547559093110
2019-01-15 14:31: ERROR in SEND try / catch (https://www.rollingstone.com/music/rss) (Error: Can't set headers after they are sent.)
2019-01-15 14:31: Sending (https://www.rollingstone.com/music/rss) - 1547559093111
2019-01-15 14:31: ERROR in SEND try / catch (https://www.rollingstone.com/music/rss) (Error: Can't set headers after they are sent.)

注意 3 个调用,以及随后捕获的两个错误。

只有一次调用该路由;为什么它会发回 3 次东西?

最佳答案

好的;来自 this answer我了解到有一个 res.headersSent bool 值 available 。另外,根据 this one ,我必须在每个 res.send() 之后通过 return; 强制执行它。

这是我的最终代码:

router.get('/feed', function(req, res) {

var dnsreq = request(req.query.feedurl);

dnsreq
.on('error', function(error) {
// The only way so far to catch a DNS error
res.send({error:error.code});
})
.on('response', function(response) {

getFeed(req.query.feedurl, function (err, feedItems, feedTitle, feedLink) {

if (feedItems && !res.headersSent) {
res.send({
feedItems: feedItems,
feedLink: feedLink,
feedTitle: feedTitle
});
return;

} else if (!res.headersSent) {
res.send({error:err});
}
});
});
});

关于node.js - 为什么这条 Express 路线会多次触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54199845/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com