好吧所以我有一个Microsoft QnA Bot的代码,我有让消息变量全局,我需要保存它。问题是它没有...如果我在函数内部运行一个console.log消息一切很好,但在消息之外恢复正常......我想做什么?谢谢!
let message = "?"; ///my var global
app.post('/send',upload.any(),function (req,res,next) {
// Post event
const translated = JSON.stringify({"question": req.body.message});
const extServerOptionsPost = {
host: 'westus.api.cognitive.microsoft.com',
path: 'https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases//generateAnswer',
method: 'POST',
headers: {
'Ocp-Apim-Subscription-Key': '',
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(translated)
}
};
const reqPost = http.request(extServerOptionsPost, function (res) {
console.log("response statusCode: ", res.statusCode);
res.on('data', function (data) {
process.stdout.write("JSON.parse(data).answers[0].answer");
message = JSON.parse(data).answers[0].answer;
console.log(message);//Everything is fine!
});
});
reqPost.write(translated); // calling my function
console.log(message)// not fine anymore :(
res.render('Bot',{quote:"no question"});
});
答案 0 :(得分:0)
有几种方法可以解决这个问题......但最快捷的方法是使用async/await
。
app.post('/send',upload.any(),async function (req,res,next) {
// Post event
const translated = JSON.stringify({"question": req.body.message});
const extServerOptionsPost = {
host: 'westus.api.cognitive.microsoft.com',
path: 'https://westus.api.cognitive.microsoft.com/qnamaker/v2.0/knowledgebases//generateAnswer',
method: 'POST',
headers: {
'Ocp-Apim-Subscription-Key': '',
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(translated)
}
};
const reqPost = await http.request(extServerOptionsPost, function (res) {
console.log("response statusCode: ", res.statusCode);
res.on('data', function (data) {
process.stdout.write("JSON.parse(data).answers[0].answer");
message = JSON.parse(data).answers[0].answer;
console.log(message);//Everything is fine!
});
});
reqPost.write(translated); // calling my function
console.log(message)// not fine anymore :(
res.render('Bot',{quote:"no question"});
});
app.post('/send',upload.any(),function (req,res,next) {
到
app.post('/send',upload.any(),async function (req,res,next) {
和
const reqPost = http.request(extServerOptionsPost, function (res) {
到
const reqPost = await http.request(extServerOptionsPost, function (res) {
还建议通过将await
包裹在try{}catch(e){}
中来为此过程添加一些错误处理。
有关承诺的更多信息:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function