我已经建立了一个用户注册/登录系统。用户可以通过电子邮件或文本注册。然后会通过电子邮件或短信发送激活码。
我有以下代码:
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)=> ...中添加异步,然后等待块,但这没用。有人知道我该如何解决这个问题吗?
谢谢!
答案 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