如何从nodejs中的内部函数调用外部函数?我正在为 Google dialogflow fulfillment 编码
How to call outer function from inner function in nodejs? I am coding for Google dialogflow fulfillment
- 你好朋友,帮我编码
dialogflow
实现。
- 这是我在内部请求模块中调用 GET Api 的代码,我想将 api 的输出输出到
conv.ask('Sales is 1 million metric tonnes ' + b)
中的外部函数
代码:
var request = require('request');
var code1 = null;
const bodyParser = require('body-parser')
const { dialogflow } = require('actions-on-google');
const assistant = dialogflow({
clientId: "305xxxx407-rv9kocdxxxxxxxxxciouuq8f9ul2eg.apps.googleusercontent.com"
});
module.exports = (app) => {
const logger = console;
assistant.intent('Sales', (conv) => {
const baseurl = 'https://www.ixxxxxxt.in:3500/getunits?unitcode=4';
var a = request(baseurl, function(error, res, body) {
var Unit = JSON.parse(body);
if (!error && res.statusCode == 200) {
var code = JSON.stringify(Unit.description);
//res.render(test(Unit));
console.log(code); // Print the google web page.
}
})
var b = (a.code);
console.log(b);
conv.ask('Sales is 1 million metric tonnes ' + b);
})
你这里有一些问题。
首先是了解 request()
在做什么。您可能不想要什么 request()
return,而是想要访问 body
,您可以从您定义的函数中获得它。
该函数实际上是您传递给 request()
的第二个参数。它被称为 回调函数 ,因为当 request()
从 URL 获取数据时,它将调用该函数。所以你想用 body
做的所有事情都需要在回调函数中完成。
但是,由于您使用的是 Dialogflow 库,并且这是在 Intent Handler 中完成的,因此您需要 return 一个 Promise 来表明您正在等待结果才能回复给用户。虽然您 可以 将 request()
包装在 Promise 中,但有更好的解决方案,最值得注意的是使用 request-promise-native 包,它与请求包非常相似,但使用承诺。
这让事情变得更容易 很多。您的代码可能看起来更像这样(未经测试):
var request = require('request-promise-native');
var code1 = null;
const { dialogflow } = require('actions-on-google');
const assistant = dialogflow({
clientId: "305xxxx407-rv9kocdxxxxxxxxxciouuq8f9ul2eg.apps.googleusercontent.com"
});
module.exports = (app) => {
const logger = console;
assistant.intent('Sales', (conv) => {
const baseurl = 'https://www.ixxxxxxt.in:3500/getunits?unitcode=4';
return request(baseurl)
.then( body => {
// You don't need the body parser anymore
let code = body.description;
conv.ask('Sales is 1 million metric tonnes ' + code);
})
.catch( err => {
console.error( err );
conv.ask('Something went wrong. What should I do now?');
});
})
- 你好朋友,帮我编码
dialogflow
实现。 - 这是我在内部请求模块中调用 GET Api 的代码,我想将 api 的输出输出到
conv.ask('Sales is 1 million metric tonnes ' + b)
中的外部函数
代码:
var request = require('request');
var code1 = null;
const bodyParser = require('body-parser')
const { dialogflow } = require('actions-on-google');
const assistant = dialogflow({
clientId: "305xxxx407-rv9kocdxxxxxxxxxciouuq8f9ul2eg.apps.googleusercontent.com"
});
module.exports = (app) => {
const logger = console;
assistant.intent('Sales', (conv) => {
const baseurl = 'https://www.ixxxxxxt.in:3500/getunits?unitcode=4';
var a = request(baseurl, function(error, res, body) {
var Unit = JSON.parse(body);
if (!error && res.statusCode == 200) {
var code = JSON.stringify(Unit.description);
//res.render(test(Unit));
console.log(code); // Print the google web page.
}
})
var b = (a.code);
console.log(b);
conv.ask('Sales is 1 million metric tonnes ' + b);
})
你这里有一些问题。
首先是了解 request()
在做什么。您可能不想要什么 request()
return,而是想要访问 body
,您可以从您定义的函数中获得它。
该函数实际上是您传递给 request()
的第二个参数。它被称为 回调函数 ,因为当 request()
从 URL 获取数据时,它将调用该函数。所以你想用 body
做的所有事情都需要在回调函数中完成。
但是,由于您使用的是 Dialogflow 库,并且这是在 Intent Handler 中完成的,因此您需要 return 一个 Promise 来表明您正在等待结果才能回复给用户。虽然您 可以 将 request()
包装在 Promise 中,但有更好的解决方案,最值得注意的是使用 request-promise-native 包,它与请求包非常相似,但使用承诺。
这让事情变得更容易 很多。您的代码可能看起来更像这样(未经测试):
var request = require('request-promise-native');
var code1 = null;
const { dialogflow } = require('actions-on-google');
const assistant = dialogflow({
clientId: "305xxxx407-rv9kocdxxxxxxxxxciouuq8f9ul2eg.apps.googleusercontent.com"
});
module.exports = (app) => {
const logger = console;
assistant.intent('Sales', (conv) => {
const baseurl = 'https://www.ixxxxxxt.in:3500/getunits?unitcode=4';
return request(baseurl)
.then( body => {
// You don't need the body parser anymore
let code = body.description;
conv.ask('Sales is 1 million metric tonnes ' + code);
})
.catch( err => {
console.error( err );
conv.ask('Something went wrong. What should I do now?');
});
})