等待http.request响应,然后再执行

时间:2020-01-15 16:10:54

标签: javascript node.js http

我已经建立了一个用户注册/登录系统。用户可以通过电子邮件或文本注册。然后会通过电子邮件或短信发送激活码。

我有以下代码:

    var activation_key_sent
    switch (signup_method) {
        case 'email':
            try {
                // send email
            } catch (error) {
                // handle errors
            }
        break
        case 'telephone':
            var text = await https.request({
                hostname: 'api.xxxx.com',
                port: xxx,
                path: 'xxxx',
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            }, (res) => {
                res.setEncoding('utf8')
                res.on('data', (chunk) => {
                    if (parseInt(chunk) > 1) {
                        // query to log the error in the database
                        activation_key_sent = false
                    } else {
                        activation_key_sent = true
                    }
                })
            })
            text.write(querystring.stringify({
                USERNAME: 'xxxx',
                SECRET: 'xxxx',
                DESTINATION: 'xxxx',
                SENDER: 'xxxx',
                BODY: activation_key
            }))

            text.end()
        break

    }
    console.log(activation_key_sent)

电子邮件部分工作正常。问题出在文字部分。发送文本时,我从服务器收到响应(块)。这是1或更高的数字。 1可以,高于1则表示错误。

执行此代码时,我看到console.log(activation_key_sent)未定义。我想我必须在某个地方停止代码以等待响应。我想在res.on('data')(我认为)。我要等待响应,如果响应= 1->查询,如果没有,请进一步处理代码。

我想我需要在某个地方进行异步/等待。我试过在res.on('data',async(chunck)=> ...中添加异步,然后等待块,但这没用。有人知道我该如何解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

更新:

尝试用这种方式将您的httpsRequest封装在Promise中。这里的主要方法是您的switch语句所嵌入的方法。

const respCode = 11;

async function main() {
  var responseCode = await new Promise(res => {
    httpsRequest(res);
  });
  // now you have responseCode from outside the callback
  console.log(responseCode);
}


// function with the similar signature to https.request
function httpsRequest( /*other args, */ callback) {
// mock your http request with the constant respCode from above
  setTimeout(() => {
    callback(respCode);
  }, 1000);
}

main();

Await通常用于将promise从回调样式语法转换为异步await语法,如下所示: doRequest().then (response => {})变成var response = await doRequest()

您没有那样的承诺。

因此,您将https.request方法与回调((res) =>)一起使用时,等待实际上并没有做任何事情。如果要插入功能,则必须在这样的回调方法中:

    var activation_key_sent
    switch (signup_method) {
        case 'email':
            try {
                // send email
            } catch (error) {
                // handle errors
            }
        break
        case 'telephone':
            var text = await https.request({
                hostname: 'api.xxxx.com',
                port: xxx,
                path: 'xxxx',
                method: 'POST',
                headers: {
                    'Content-Type': 'application/x-www-form-urlencoded'
                }
            }, (res) => {
                res.setEncoding('utf8')
                res.on('data', (chunk) => {
                    if (parseInt(chunk) > 1) {
                        // query to log the error in the database
                        activation_key_sent = false
                    } else {
                        activation_key_sent = true
                    }
                })
                console.log(activation_key_sent)
            })
            text.write(querystring.stringify({
                USERNAME: 'xxxx',
                SECRET: 'xxxx',
                DESTINATION: 'xxxx',
                SENDER: 'xxxx',
                BODY: activation_key
            }))

            text.end()
        break

    }

此外,如果您坚持使用https.request和async / await模式,那将是另一个主题: https://medium.com/@gevorggalstyan/how-to-promisify-node-js-http-https-requests-76a5a58ed90c