javascript - 如何从nodejs中的内部函数调用外部函数?我正在为 Google 对话流实现编码
问题描述
- 你好朋友,帮我完成编码
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()
返回什么,而是想要访问body
从您定义的函数中获得的 。
该函数实际上是您传递给的第二个参数request()
。它被称为回调函数,因为当request()
从 URL 中获取数据时,它会调用该函数。所以你想做的所有事情都body
需要在回调函数中完成。
但是,由于您使用的是 Dialogflow 库,并且这是在 Intent Handler 中完成的,因此您需要返回一个 Promise 以表明您正在等待结果,然后它才能回复用户。虽然您可以包装request()
Promise,但有更好的解决方案,最值得注意的是使用request-promise-native包,它与 request 包非常相似,但使用了 Promises。
这使事情变得容易得多。您的代码可能看起来更像这样(未经测试):
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?');
});
})
推荐阅读
- python-3.x - 是否有使用python删除给定句子的字母数字单词的功能
- bash - 为什么我无法在 Bash 4.2.0 上重现 ShellShock Bash 错误?
- android-management-api - Android Management API 从受管设备的工作资料中卸载应用
- php - WooCoomerce:如果在创建订单时存在其他类别产品,则自动添加产品行项目
- office-js - 有没有办法在 Outlook 中实现拖放
- android - 蓝牙扫描仪未发现设备
- reactjs - 来自数据的 React、ApexCharts、Radial Bar 系列值
- reactjs - 如何在 ReactJs 中缩短代码而不是使用 Switch case
- sql-server - 用户 'IIS APPPOOL\ 登录失败
- php - 发送电子邮件bu URL参数