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.

Другие вопросы по тегам