한다 getaddrinfo의 ENOTFOUND API는 Google 클라우드
나는 성공적으로 모든 것을 만들어를, API 내에서 로봇을 만들어 만든 내 PC에 NodeJS를 설치하고 Google Cloud Platform을 연결했습니다.
그런 다음 World Weather Organization의 API 키를 사용하여 API.ai 안내서에 명시된대로 정확하게 index.js 파일을 복사했습니다 (아래 참조).).
하지만 봇을 사용할 때 작동하지 않습니다. Google Cloud Platform에서 오류는 항상 동일합니다.
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);
});
});
});
}