node.js - 如何使用异步/等待从另一个函数访问请求的主体?

标签 node.js http express asynchronous promise

对不起,通用标题。我对 nodejs 以及异步/等待的想法都很陌生。

所以我有一个 express 应用程序,它发出一个 HTTP get 请求作为回调函数。回调函数获取主体对象,并将其返回给 getBody 函数。但是当我尝试将 getBody 分配给一个变量时,它返回未定义。

是的,我知道。 getBody 函数在 body 填充数据之前返回 body,但我只是不知道如何为这个 body 对象编写 getter 方法。所以我的问题是,如何在全局范围内同时运行 get 请求和访问 body 对象,以便所有依赖于 body 对象的函数都可以运行而不会出现进一步的问题。

async function getBody (req, res, next) {
    let body = await makeRequest(req, res);
    return body; // THIS RETURNS UNDEFINED

}

router.get('/', getBody);

function makeRequest (req, res){

    let uri;

    let options = {
        uri: uri,
    };

    request(options,  function (error, response, body) {
        if (error){
            console.log('error:', error);
        } else {
            console.log('Success! statusCode:', response && response.statusCode);
            let jsonObject =  JSON.parse(body);

            return jsonObject;
        }
    });
}

我做了研究,但找不到有用的资源。提前致谢。

最佳答案

awaitasync 应该和promise一起使用,这些方法不能返回数据。 return 用于从同步方法返回一个值。

所以你可以像这样从你的 makeRequest 方法返回一个 promise ,

async function getBody(req, res, next) {
    let body = await makeRequest(req, res);
    return body; // NOW BODY IS NOT UNDEFINED, call next() or send response here
}

router.get('/', getBody);

function makeRequest(req, res) {
    return new Promise((resolve, reject) => {
        let uri;

        let options = {
            uri: uri,
        };

        request(options, function (error, response, body) {
            if (error) {
                console.log('error:', error);
                return reject(error);
            } else {
                console.log('Success! statusCode:', response && response.statusCode);
                let jsonObject = JSON.parse(body);

                return resolve(jsonObject);
            }
        });
    })
}

仅供引用,

let body = await makeRequest(req, next)

等于

makeRequest(req, next).then(body => { /* YOUR CODE HERE */ })

如果您不知道,则必须处理正文并发送响应,return body 不会将响应发送给客户端。

关于node.js - 如何使用异步/等待从另一个函数访问请求的主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52605645/

相关文章:

javascript - S3 下载文件名中带有逗号的图像会导致 "net::ERR_RESPONSE_HEADERS_MULTIPLE_CONTENT_DISPOSITION"

java - 轴2选项: setAction()

node.js - 我需要在哪里加载用户数据 block 以及最好的方法是什么?

http - 发布(仅)文件的正确内容类型是什么?

node.js - 尝试与 Mongoose 连接时,为什么会得到 "mongoose.connect is not a function"?

javascript - "Parse Error: Header overflow"Node.js GET 请求期间

node.js - 如何知道值为空

node.js - 有没有办法让 puppeteer 的 waitUntil "networkidle"只考虑 XHR (ajax) 请求?

node.js - 带有 http.createServer 的服务器和在 Node js 中使用 express 的服务器之间的区别

http - hsts 预加载如何在后端工作