如何在node.js中为单个请求返回2个响应
我的节点应用程序很简单,对于查询mysql数据库中总客户的请求,我使用await进行了块调用,以等待查询完成。问题是它每秒只能处理约75个请求,太低了。
因此,每当我收到请求时,我都尝试返回200,告诉呼叫者我收到请求。准备好后返回查询结果,mysql查询可能需要一段时间。
但尚未为我工作,这是代码:
路由器:
router.get('', controller.getCustomers);
控制器:
const getCusomers = (req, res) => {
try {
service.getCustomers(res);
res.write('OK');
//res.send(200); this will end the response before query ends
} catch (err) {
res.end(err);
}
服务:
const getCustomers = async (res) => {
customers = await mysqlPool.query('select * from cusomerTable');
res.send(customers);
}
错误:将标头发送到客户端后,无法设置标头。
如何解决此问题?
回答如下:您可以使用服务器发送的事件。您可以在收到请求后立即发送事件。结果准备好后,您可以发送另一个事件。请找到我的GitHub repo对SSE样本有用。
或
您可以只使用res.write()来流式传输响应。发现此StackOverflow answer有用。
如何在node.js中为单个请求返回2个响应
我的节点应用程序很简单,对于查询mysql数据库中总客户的请求,我使用await进行了块调用,以等待查询完成。问题是它每秒只能处理约75个请求,太低了。
因此,每当我收到请求时,我都尝试返回200,告诉呼叫者我收到请求。准备好后返回查询结果,mysql查询可能需要一段时间。
但尚未为我工作,这是代码:
路由器:
router.get('', controller.getCustomers);
控制器:
const getCusomers = (req, res) => {
try {
service.getCustomers(res);
res.write('OK');
//res.send(200); this will end the response before query ends
} catch (err) {
res.end(err);
}
服务:
const getCustomers = async (res) => {
customers = await mysqlPool.query('select * from cusomerTable');
res.send(customers);
}
错误:将标头发送到客户端后,无法设置标头。
如何解决此问题?
回答如下:您可以使用服务器发送的事件。您可以在收到请求后立即发送事件。结果准备好后,您可以发送另一个事件。请找到我的GitHub repo对SSE样本有用。
或
您可以只使用res.write()来流式传输响应。发现此StackOverflow answer有用。