Начало работы с wit.ai и Node.js

голоса
0

Я пытаюсь использовать wit.ai пример QuickStart . Пример работы с закодированных значений , но когда я использую партия погоды API третьего и попытаться дать ответ пользователю это не работает.

Рабочий код:

 const actions = {
         send(request, response) {
           const {sessionId, context, entities} = request;
           const {text, quickreplies} = response;
           console.log('sending...', JSON.stringify(response));
         },
         getForecast({context, entities}) {
           var location = firstEntityValue(entities, 'location');
           if (location) {
             context.forecast = 'sunny in ' + location; // we should call a weather API here
             delete context.missingLocation;

           } else {
             context.missingLocation = true;
             delete context.forecast;
           }
           return context;
         },
       };

Теперь я написал функцию getWeather ({контекст, сущности}, местоположение) для вызова API погоды третьей стороны и получить информацию о погоде для данного пользователя места.

Нерабочий код:

var getWeather = function ({ context, entities }, location) {
  console.log('Entities: ',entities)
  var url = 'http://api.openweathermap.org/data/2.5/weather?q=' + location + '&appid=myAppID';
  request.get(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(typeof body) 
      var weatherObj = JSON.parse(body);
      console.log('weather api res: ', weatherObj.weather[0].description);
      context.forecast = weatherObj.weather[0].description + ' ' + location; // we should call a weather API here
      delete context.missingLocation;
    }
  })
}

const actions = {
  send(request, response) {
    const {sessionId, context, entities} = request;
    const {text, quickreplies} = response;
    console.log('sending...', JSON.stringify(response));
  },
  getForecast({context, entities}) {
    var location = firstEntityValue(entities, 'location');
    if (location) {
      //Call a function which calls the third party weather API and then handles the response message.
      getWeather({ context, entities }, location);
    } else {
      context.missingLocation = true;
      delete context.forecast;
    }
    return context;
  },
};

Кроме того, если я немного изменить функцию getWeather () и переместить context.forecast = «солнечно в» + месте; удалить context.missingLocation; вне обратного вызова Fuction из request.GET () называют это снова будет работать, но на данный момент у меня нет информации о погоде от 3 партии апи:

Рабочий код:

var getWeather = function ({ context, entities }, location) {
  //Keeping context.forecast outside the request.get() callback function is useless as we yet to get the weather info from the API
  context.forecast = 'sunny in ' + location;
  delete context.missingLocation;
  console.log('Entities: ',entities)
  var url = 'http://api.openweathermap.org/data/2.5/weather?q=' + location + '&appid=myAppID';
  request.get(url, function (error, response, body) {
    if (!error && response.statusCode == 200) {
      console.log(typeof body) 
      var weatherObj = JSON.parse(body);
      console.log('weather api res: ', weatherObj.weather[0].description);
    }
  })
}

Так как сделать context.forecast = apiRes + расположение; линия работа внутри обратного вызова HTTP вызова? Что я делаю неправильно здесь?

Примечание: ответ ошибки я получаю от wit.ai:

Ошибка: К сожалению, я не знаю, что делать.

at F:\..\node-wit\lib\wit.js:87:15
at process._tickCallback (internal/process/next_tick.js:103:7)

Я использую пакет НПМ запроса , чтобы сделать HTTP звонки внутри узла.

Задан 16/01/2017 в 10:30
источник пользователем
На других языках...                            


1 ответов

голоса
1

Решил проблему должным образом разрешения обещания. Вот полный код:

'use strict';

let Wit = null;
let interactive = null;

var getWeather = function ( location) {
  var url = 'http://api.openweathermap.org/data/2.5/weather?q=' + location + '&appid=myAppID';
  return fetch(url, {
    method: 'GET',
    headers: {
      'Content-Type': 'application/json',
      'Accept': 'application/json',
    }
  })
    .then(rsp => {
      var res = rsp.json();
      return res;
    })
    .then(json => {
      if (json.error && json.error.message) {
        throw new Error(json.error.message);
      }
      return json;
    });
}

try {
  // if running from repo
  Wit = require('../').Wit;
  interactive = require('../').interactive;
} catch (e) {
  Wit = require('node-wit').Wit;
  interactive = require('node-wit').interactive;
}

const accessToken = (() => {
  if (process.argv.length !== 3) {
    console.log('usage: node examples/quickstart.js <wit-access-token>');
    process.exit(1);
  }
  return process.argv[2];
})();

// Quickstart example
// See https://wit.ai/ar7hur/quickstart

const firstEntityValue = (entities, entity) => {
  const val = entities && entities[entity] &&
    Array.isArray(entities[entity]) &&
    entities[entity].length > 0 &&
    entities[entity][0].value;
  if (!val) {
    return null;
  }
  return typeof val === 'object' ? val.value : val;
};

const actions = {
  send(request, response) {
    const {sessionId, context, entities} = request;
    const {text, quickreplies} = response;
    return new Promise(function (resolve, reject) {
      console.log('sending...', JSON.stringify(response));
      return resolve();
    });
  },
  getForecast({context, entities}) {
    var location = firstEntityValue(entities, 'location');
    if (location) {
      return new Promise(function (resolve, reject) {
        return getWeather(location).then(weatherJson => {
          context.forecast = weatherJson.weather[0].description + ' in the ' + location;
          delete context.missingLocation;
          return resolve(context);
        })
      });
    } else {
      context.missingLocation = true;
      delete context.forecast;
      return Promise.reject(context);
    }
    return context;
  },
};

const client = new Wit({ accessToken, actions });
interactive(client);
Ответил 17/01/2017 в 06:32
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more