2017-10-11 12 views
0
내가 구글 어시스턴트 (여기에 하나를 https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation) 날씨 봇을 구축하기위한 API.AI 자습서를 실행하기 위해 노력하고있어

한다 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); 
     }); 
    }); 
    }); 
} 

답변

2

오 소년, 사실 이유는 지금까지 가장 바보. Google Cloud Platform에서 '결제'를 사용 설정하지 않았기 때문에 모든 항목이 차단 된 것입니다 (API 무료 테스트를 사용하고 있음에도 불구하고). 그들은 단지 내 신용 카드 번호를 원했습니다. 이제 작동합니다.