添加电子邮件地址到列表时,如果地址属于现有用户,我想在我的云代码中检查beforeSave函数。如果没有,我想停止保存调用,并返回一个错误响应到我的移动应用程序。
当我运行下面的代码时,我在输入有效的电子邮件地址时没有问题。然而,只要我输入一个无效的地址,beforeSave函数就会进入一个混乱状态,并在一段时间后超时,向客户端返回一堆垃圾。
Parse.Cloud.beforeSave("EventUsers", function(request, response) {
var email = request.object.get("email");
console.log("starting beforeSave for user: " + email);
Parse.Cloud.useMasterKey();
var userQuery = new Parse.Query(Parse.User);
userQuery.equalTo("email", email);
userQuery.first().then(function(user) {
console.log("user: " + user.get("email"));
if (user) {
console.log("User exists");
response.success();
}
console.error("No user with that email");
response.error("199");
}, function(error) {
console.error(error);
response.error("198");
});
});
当我用一个无效的电子邮件地址运行这个时,我只得到第一个console.log调用报告给我的控制台-其他的都没有显示。
我在Heroku上运行解析服务器
你是在parse.com上运行这个还是在你自己的mongodb后端?
在任何情况下,你的问题是电子邮件可能没有索引,所以它正在做一个全表扫描。如果是您自己的后端,您可以在集合中为电子邮件添加索引。
如果你正在运行自己的数据库,不确定是否有人已经这样做了(我还没有,但应该),但你也可以在电子邮件上设置一个唯一的约束,然后你可以简单地在user.save()上捕获被拒绝的承诺,而不用担心beforeave钩子。