首页 > 解决方案 > 如何从nodejs中的内部函数调用外部函数?我正在为 Google 对话流实现编码

问题描述

  1. 你好朋友,帮我完成编码dialogflow
  2. 这是我在内部请求模块中调用 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);
        })

标签: javascriptnode.jsrestdialogflow-es

解决方案


你这里有几个问题。

首先是了解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?');
            });
    })

推荐阅读