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" 查看有关此激活的信息。里面应该是状态或者结果。
- 我怀疑这是一个异步调用。我建议你也可以尝试"wsk -i action invoke --blocking"等待结果回来。 --blocking 意味着 return 和结果。
我在 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" 查看有关此激活的信息。里面应该是状态或者结果。
- 我怀疑这是一个异步调用。我建议你也可以尝试"wsk -i action invoke --blocking"等待结果回来。 --blocking 意味着 return 和结果。