我正在寻找有关如何使用
mongodb / mongoose为“查找或创建”功能链接承诺的建议.
我目前试过:
userSchema.statics.findByFacebookIdOrCreate = function(facebookId, name, email) {
var self = this;
return this.findOne({
facebookId: facebookId
}).exec().then(function(user) {
if (!user) {
return self.model.create({
facebookId: facebookId,
name: name,
email: email
}).exec().then(function(user) {
return user;
});
}
return user;
});
};
我从我的(node / express)API端点调用它:
User.model.findByFacebookIdOrCreate(fbRes.id, fbRes.name, fbRes.email)
.then(function(user) {
return res.sendStatus(200).send(createTokenForUser(user));
}, function(err) {
return res.sendStatus(500).send({
error: err
});
});
问题是:
>即使user在findOne查询中为null,也永远不会调用create
>我不确定我是否使用了正确的承诺风格/最有效的编码风格
>我是否正确处理错误,例如只是在顶层或我是否需要在每个级别进行
任何人都可以看到我做错了什么,以及我怎么能做得更好?
谢谢.
UPDATE
问题的原因是
self.model.create(...)
应该是(没有型号参考)
self.create(...)
但是,我现在需要知道我在错误处理方面做错了什么 – 我可以看到发生错误,但我看不出原因.
我仍然有一些错误发生,我知道因为我的状态为500
return res.sendStatus(500).send({ error: err });
但实际的错误消息/详细信息为空.
最佳答案 问题可能是:
> create方法返回一个promise,它没有方法exec
>如果你想在自定义方法中使用then(),你必须返回一个promise,但是你要返回一个mongoose文件:return user;
这将始终返回一个promise,它允许你在你的方法之后使用then()(你将不得不添加mpromise模块):
userSchema.statics.findByFacebookIdOrCreate = function (facebookId, name, email) {
var self = this;
var Promise = require('mpromise');
var promise = new Promise;
this.findOne({facebookId: facebookId }).exec()
.then(function (user) {
if(user) {
promise.fulfill(user);
return;
}
self.model.create({ facebookId: facebookId, name: name, email: email })
.then(function (user) {
promise.fulfill(user);
return;
});
});
return promise;
};
希望这对你有所帮助