OpenWhisk 在第一次调用后停止响应

OpenWhisk stops responding, after the first call

我在 Windows 10 上使用 Vagrant VM。我在 Node.Js 中编写了一个动作函数。这是一个轻量级的实验函数,用于检查 OpenWhisk 操作与 MongoDB 的连接,用 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 都是全新的。

要开始对此进行调查,请在本例中使用 wsk activation list 612da4ebb5f64795ada4ebb5f6e7957c 至少获取激活失败的日志。

我认为您操作中的错误处理不正确。如果 find 调用 return 出错,则 Promise 永远不会被解决。

我简要浏览了 mongoose 的文档。 find 显然可以 return 一个 Promise 如果你在上面调用 exec

在任何情况下,请确保尽可能多地使用 Promise 组合器,这样您就可以非常肯定地正确处理任何边缘情况,并且 Promise 始终以一种或另一种方式完成。如果您需要退出 "manual" 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;

我根据命令的一些评论: 1.请求还没有结束,id为612da4ebb5f64795ada4ebb5f6e7957c 尝试 "wsk -i activation get 612da4ebb5f64795ada4ebb5f6e7957c" 查看有关此激活的信息。里面应该是状态或者结果。

  1. 我怀疑这是一个异步调用。我建议你也可以尝试"wsk -i action invoke --blocking"等待结果回来。 --blocking 意味着 return 和结果。