在响应传入请求之前,如何确保已经返回承诺(Swagger / Express)

时间:2017-09-25 13:24:32

标签: node.js express request synchronization

我正在尝试编写一个简单的Swagger API,它允许我按需同步几个系统。同步是一种方式,因此基本上最终目标是向两个系统发送请求,查看原点上的新内容/更改/删除内容,然后更新目标。我一直在尝试使用node.js而不是Java来做这个,我更习惯,作为一种学习经验,但由于异步性质,我真的很难找出一个关键问题。

作为测试,我在IntelliJ上构建了一个简单的Express node.js应用程序,其中一个路由我正在调用从不同文件导出的函数并尝试获取响应。不幸的是,这不是很好。我所做的就是:

getit.js - (这是Ron Swanson生成器得到报价)

const rp = require('request-promise');

async function dorequest() {

    const response = await rp(uri);
    return Promise.resolve(response);
};

module.exports = {dorequest}

在我做过的路线中:

var getit = require ('./getit.js');
/* GET users listing. */
router.get('/', function(req, res, next) {
    var ret = getit.dorequest();
    res.send(ret);
    console.log('res out' + ret);
});

我在控制台中得到的是

  

res out [object Promise]   而且反应当然是空的。

我做错了什么?我已经玩了一个星期了一周,尝试了各种方法,但我一直得到类似的结果。我显然错过了一些东西,并希望得到一些帮助。 谢谢!

2 个答案:

答案 0 :(得分:1)

对象为空,因为它是在解析Promise之前写在控制台上的。你必须等到Promise得到解决然后再发送回复,所以尝试改变你的代码:

var getit = require ('./getit.js');

/* GET users listing. */
router.get('/', function(req, res, next) {
    getit.dorequest().then(function(data) {
        console.log('res out' + data);
        res.send(data);
    });
});

答案 1 :(得分:0)

由于您使用的是async/await方法,所以您只需在await之前放置getit.dorequest();

所以这一行看起来像var ret = await getit.dorequest();