我正在使用Parse Server并遇到异步功能无法按预期运行的问题。我正在AWS Lambda的Node.js 8.10上运行它。这是我的功能的一个(非常简化的)版本:
Parse.Cloud.job("updateSubscriptions", async (req, res) => {
try {
winston.info("Updating subscriptions...");
var Subscription = Parse.Object.extend("Subscription");
var query = new Parse.Query(Subscription);
await query.find().then(
function () {
winston.debug("Got subscriptions.");
},
function(error) {
winston.error("Error querying subscriptions.");
}
);
winston.debug("Wrapping up.");
} catch (e) {
winston.error("Uh oh.");
}
});
我想要(并期望)得到输出“正在更新订阅...已得到订阅。结束。”
实际上发生的是,我看到“正在更新订阅...”,仅此而已。看来该函数实际上并没有在等待异步调用,并且/或者Lambda正在尽早取消该进程。
有人知道我在做什么错吗?
答案 0 :(得分:2)
我已经解释了为什么它不是故意造成的错误。因此,您可以将运行的时间延长到httpRequest超时之前。
如果看一下代码here,您会发现handleCloudJob()函数的作用很长,可以将作业执行与请求生命周期隔离开。这是按设计和没有错误。
现在,让我们看看它在lambda中如何工作:
现在想象一下,我们没有这样做:
at if而不是6。发送答复,我们正在“等待”工作,就像您建议的那样
会发生什么:
现在在您的lambda环境中会发生什么:
这是预期的行为。
会更好吗?也许可以,但是这需要完全不同的作业执行环境。基本上是等待在后台执行长时间功能的消息的工作程序(因此不是前端lambda)
在lambdas常见问题解答中指出default timeout is 3s,并且可以扩展到最大300s。因此,默认情况下,lambda不适合运行作业。
虽然我了解您的无奈,并且对“您”没有任何意义,但这全是设计使然。
即使我们在parse-server上交换了实现,也不会适合lambda运行作业。