2017-10-11 114 views
0

我试图执行API.AI教程为构建天气对机器人谷歌助理(这里的一个:https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation的getaddrinfo ENOTFOUND API谷歌云

我成功了一切,创建API中的机器人,创建配置,在我的电脑上安装了NodeJS,连接了Google Cloud Platform等。

然后我创建了index.js文件,它完全按照API.ai教程中的说明使用我的世界气象组织的API密钥进行了复制(请参见下文)。

但是,当我使用机器人,它不起作用。在Google云端平台上,错误总是相同的:

Error: getaddrinfo ENOTFOUND api.worldweatheronline.com api.worldweatheronline.com:80

at errnoException (dns.js:28) 
    at GetAddrInfoReqWrap.onlookup (dns.js:76) 

无论我多么频繁地做这件事,我都会得到相同的错误。所以我实际上并没有达到API。我试图看看是否有任何改变WWO方面(URL等),但显然没有。我更新了NodeJS,仍然是同样的问题。我完全刷新了Google Cloud平台,并没有帮助。

那个我真的不能调试。谁能帮忙?

下面的代码从API.ai:

'use strict'; 
const http = require('http'); 
const host = 'api.worldweatheronline.com'; 
const wwoApiKey = '[YOUR_API_KEY]'; 
exports.weatherWebhook = (req, res) => { 
    // Get the city and date from the request 
    let city = req.body.result.parameters['geo-city']; // city is a required param 
    // Get the date for the weather forecast (if present) 
    let date = ''; 
    if (req.body.result.parameters['date']) { 
    date = req.body.result.parameters['date']; 
    console.log('Date: ' + date); 
    } 
    // Call the weather API 
    callWeatherApi(city, date).then((output) => { 
    // Return the results of the weather API to Dialogflow 
    res.setHeader('Content-Type', 'application/json'); 
    res.send(JSON.stringify({ 'speech': output, 'displayText': output })); 
    }).catch((error) => { 
    // If there is an error let the user know 
    res.setHeader('Content-Type', 'application/json'); 
    res.send(JSON.stringify({ 'speech': error, 'displayText': error })); 
    }); 
}; 
function callWeatherApi (city, date) { 
    return new Promise((resolve, reject) => { 
    // Create the path for the HTTP request to get the weather 
    let path = '/premium/v1/weather.ashx?format=json&num_of_days=1' + 
     '&q=' + encodeURIComponent(city) + '&key=' + wwoApiKey + '&date=' + date; 
    console.log('API Request: ' + host + path); 
    // Make the HTTP request to get the weather 
    http.get({host: host, path: path}, (res) => { 
     let body = ''; // var to store the response chunks 
     res.on('data', (d) => { body += d; }); // store each response chunk 
     res.on('end',() => { 
     // After all the data has been received parse the JSON for desired data 
     let response = JSON.parse(body); 
     let forecast = response['data']['weather'][0]; 
     let location = response['data']['request'][0]; 
     let conditions = response['data']['current_condition'][0]; 
     let currentConditions = conditions['weatherDesc'][0]['value']; 
     // Create response 
     let output = `Current conditions in the ${location['type']} 
     ${location['query']} are ${currentConditions} with a projected high of 
     ${forecast['maxtempC']}°C or ${forecast['maxtempF']}°F and a low of 
     ${forecast['mintempC']}°C or ${forecast['mintempF']}°F on 
     ${forecast['date']}.`; 
     // Resolve the promise with the output text 
     console.log(output); 
     resolve(output); 
     }); 
     res.on('error', (error) => { 
     reject(error); 
     }); 
    }); 
    }); 
} 

回答

2

哦,孩子,其实原因是最笨的永远。我没有在Google Cloud Platform上启用“结算”功能,这就是为什么它阻止了所有内容(即使我正在使用API​​的免费测试)。他们只是想要我的信用卡号码。它现在有效