getaddrinfo ENOTFOUND API Google Cloud
Я пытаюсь выполнить учебник API.AI для создания метеобота для Google Assistant (здесь: https://dialogflow.com/docs/getting-started/basic-fulfillment-conversation)
Я все сделал успешно, создал бота в API, создал Fulfillments, установил NodeJS на свой компьютер, подключил Google Cloud Platform и т. Д.
Затем я создал файл index.js, скопировав его в точности так, как это указано в руководстве по API.ai, с моим ключом API от Всемирной организации погоды (см. Ниже).
Но когда я использую бот, это не работает. На Google Cloud Platform ошибка всегда одна и та же:
Ошибка: 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). Они просто хотели номер моей кредитной карты. Теперь работает
У меня была та же самая проблема, пытающаяся поразить мой db. Оплата не была исправлена, поскольку у меня уже была включена оплата.
Для меня это было knexfile.js
Настройка для MySql - в частности, connection
объект. В этом объекте вы должны заменить host
ключ с socketPath
; и подготовить /cloudsql/
к стоимости. Вот пример:
connection: {
// host: process.env.APP_DB_HOST, // The problem
socketPath: `/cloudsql/${process.env.APP_DB_HOST}`, // The fix
database: process.env.APP_DB_NAME,
user: process.env.APP_DB_USR,
password: process.env.APP_DB_PWD
}
куда process.env.APP_DB_HOST
ваше имя подключения к экземпляру
PS: я думаю, что даже если вы не используете Knex
, host
или же server
параметр типичной строки подключения к БД должен быть вызван socketPath
при подключении к Google Cloud SQL.