OpenWhisk перестает отвечать после первого звонка - PullRequest
0 голосов
/ 29 августа 2018

Я использую Vagrant VM в Windows 10. Я написал функцию действия в Node.Js. Это легкая экспериментальная функция для проверки подключения к MongoDB из действия OpenWhisk, написанная в Node.JS. Ниже приведен код.

     function entryPoint(args) {



        var mongoose = require('mongoose');
        var MongoClient = require('mongodb').MongoClient;
        var Schema = mongoose.Schema;

        mongoose.Promise = global.Promise;


        return new Promise((resolve, reject) => {

          mongoose.connect("mongodb://192.168.16.1:27017/angularcrud").then(
            () => 
            {

              var Coin = new Schema({ 
                name: {
                  type: String
                },
                price: {
                  type: Number
                }
              });
              var coinModel = mongoose.model('Coin', Coin);

              coinModel.find(function (err, coins){
                if(err){
                  console.log(err);
                }
                else {
                  resolve({coins})
                }
              });

            },
            err => { return reject(err)}
            ); 

        })



      }

 module.exports.main = entryPoint;

Я заархивировал файлы NodeJS и создал действие в wsk. Когда я запускаю это в первый раз Я получаю ожидаемые результаты. Но когда я запускаю его во второй раз, вызов звонит примерно минуту, а затем я вижу следующую ошибку.

ok: invoked /_/getcoins, but the request has not yet finished, with id 612da4ebb5f64795ada4ebb5f6e7957c

Я не знаю, с чего мне начать расследование, так как я совершенно новичок в OpenWhisk и MongoDb.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Несколько замечаний, которые я основал на командах: 1. Запрос еще не закончен, с идентификатором 612da4ebb5f64795ada4ebb5f6e7957c Попробуйте "wsk -i активации get 612da4ebb5f64795ada4ebb5f6e7957c", чтобы увидеть информацию об этой активации. Это должен быть статус или результат там.

  1. Я подозреваю, что это асинхронный вызов. Я предлагаю также попробовать "wsk -i action invoke --blocking", чтобы дождаться возвращения результата. --blocking означает возврат с результатами.
0 голосов
/ 29 августа 2018

Чтобы начать расследование, используйте wsk activation list 612da4ebb5f64795ada4ebb5f6e7957c в этом случае, чтобы получить как минимум журналы вашей неудачной активации.

Я думаю, что обработка ошибок в ваших действиях неверна. Если вызов find возвращает ошибку, Обещание никогда не разрешается.

Я кратко ознакомился с документацией mongoose. find, по-видимому, может вернуть Promise, если вы позвоните exec.

В любом случае, убедитесь, что вы используете как можно больше комбинаторов Promise, так что вы в значительной степени гарантируете, что любой крайний случай будет правильно обработан и Promise всегда завершается тем или иным способом. Если вам нужно отказаться от «ручного» создания Обещаний, ограничьте их как можно меньше.

function entryPoint(args) {
    var mongoose = require('mongoose');
    var Schema = mongoose.Schema;
    mongoose.Promise = global.Promise;

    return mongoose.connect("mongodb://192.168.16.1:27017/angularcrud").then(() => {
        var Coin = new Schema({ 
            name: {
                type: String
            },
            price: {
                type: Number
            }
        });
        var coinModel = mongoose.model('Coin', Coin);
        return coinModel.find().exec();
    });
}

 module.exports.main = entryPoint;
...