node.js - express 接收http请求时怎么做异步回复
高洛峰
高洛峰 2017-04-17 13:58:51
[Node.js讨论组]

var app = require('express')();
app.post('/getsomething', function(req, resp){

//操作A:根据req去另一个地方请求数据(异步)
//此时无法立即回复这个请求

});

想要在操作A有结果的时候拿到当时的resp,可以回复这个请求resp.send('result')

可以实现吗?

尝试按req的某个字段将resp存到redis中,当操作A有结果时取出来回复
但是存redis时JSON.stringify(resp)失败, Converting circular structure to JSON

求大神指教

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回复(3)
天蓬老师

你问的问题不成立
在建立连接之后,代码段是同步的,浏览器这个时候会等待返回,Http协议只能一次返回数据,此时做异步操作没有意义。当执行到resp.send之后,客户端会收到数据并关闭这个链接。

我有点明白你的意思,你想的是client请求后,先给个回复,然后过一会儿有了操作之后,再给个回复
那就是socket.io啊,想什么时候发数据就什么时候发

怪我咯

如果不是楼上描述的情况,只是返回一次response,那么少年,放心异步去吧。只是别忘了做好异步的控制(无论是传统回调还是promise,generator,async)。

举个例子,数据库的相关访问(io操作)大部分情况下都是异步的,所以说在处理请求的时候就放心的异步吧。最后记得返回一个res,记得最后才返回。

大家讲道理

想要在操作A有结果的时候拿到当时的resp,可以回复这个请求resp.send('result') 可以实现吗?

当然可以,我假设你的异步请求A可以得到一个Promise,参考代码:

app.post('/getsomething', function(req, resp){
    //参数在这
    var aaa = req.params.aa;
    requestA()
        .then(function(resultFromA){
            //在这组合你的参数aaa和从A拿来的结果
            resp.send(结果);
        });
});

尝试按req的某个字段将resp存到redis中,当操作A有结果时取出来回复

上一问解决了,你还需要这个么?

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号