如何从nodejs中的内部函数调用外部函数?我正在为 Google dialogflow fulfillment 编码

How to call outer function from inner function in nodejs? I am coding for Google dialogflow fulfillment

  1. 你好朋友,帮我编码dialogflow实现。
  2. 这是我在内部请求模块中调用 GET Api 的代码,我想将 api 的输出输出到 conv.ask('Sales is 1 million metric tonnes ' + b)
  3. 中的外部函数

代码:

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?');
            });
    })