在第一个调用之后,OpenWhisk停止响应

时间:2018-08-29 13:43:25

标签: mongodb openwhisk

我正在Windows 10上使用Vagrant VM。我已经在Node.Js中编写了一个动作函数。这是一个轻量级的实验功能,用于检查以Node.JS编写的OpenWhisk操作与MongoDB的连接。以下是代码。

     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 :(得分:2)

要开始对此进行调查,在这种情况下,请使用wsk activation list 612da4ebb5f64795ada4ebb5f6e7957c至少获取激活失败的日志。

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

我简要浏览了mongoose的文档。如果您在find上调用Promise,则exec显然可以返回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;

在任何情况下,请确保尽可能多地使用Promise组合器,因此可以保证任何边缘情况均得到正确处理,并且Promise总是以一种或另一种方式完成。如果您需要退出以“手动”方式创建Promises,请将它们的范围设置得尽可能小。

const deleteUniversRefInTarget = (universName, targetName) => {
  console.log('Appel de deleteUniversRefInTarget')
  const promis = new Promise((resolve, reject) => {
    Target.findOneAndUpdate({ univers: universName, name: targetName },
      (err, target) => {
        console.log('Entrée dans la promesse')
        if (err) {
          reject(err)
        } else {
          if (target === null) {
            reject(TypeError(`Invalid univers'n name ${universName}`))
          } else {  
            if (target.univers.length === 1) {
              resolve('deleteTarget')
            } else {
              target.univers.splice(target.univers.indexOf(universName), 1)
              resolve('dereferencedUnivers')
            }
          }
        }
      })
  })
  return promis
}

答案 1 :(得分:0)

基于命令,我有几句话: 1.请求尚未完成,标识为612da4ebb5f64795ada4ebb5f6e7957c 尝试“ wsk -i激活获取612da4ebb5f64795ada4ebb5f6e7957c”以查看有关此激活的信息。应该是状态或结果。

  1. 我怀疑这是一个异步调用。我建议您也可以尝试“ wsk -i action invoke --blocking”以等待结果返回。 --blocking表示返回结果。