我正在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都是陌生的。
答案 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”以查看有关此激活的信息。应该是状态或结果。