【发布时间】:2015-01-21 13:21:15
【问题描述】:
我正在寻找有关如何使用 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
});
});
问题是:
- 即使用户在 findOne 查询中为 null,也永远不会调用 create
- 我不确定我使用的是正确的承诺风格/最有效的编码风格
- 我是否正确处理错误,例如仅在顶层还是我需要在每个级别都这样做
谁能看到我做错了什么,以及如何才能做得更好?
谢谢。
更新
问题的原因是
self.model.create(...)
应该是(没有模型参考)
self.create(...)
但是,我现在需要知道我在错误处理方面做错了什么 - 我可以看到错误正在发生,但我看不到原因。
我仍然有一些我知道的错误发生,因为我的状态为 500
return res.sendStatus(500).send({ error: err });
但实际的错误消息/详细信息为空。
【问题讨论】:
-
1.试试
return self.model.create(...2. 链接承诺时,总是返回一个新的承诺或最终值。 3. 最后有一个错误函数就好了。 -
谢谢,我最初确实有那个回报,但它没有帮助。才拿出来看看效果。
-
我已编辑问题以将退货放回原处。还有其他想法吗?
-
嗯,这很奇怪。我以为它被调用了,但由于缺少
return,您没有得到它的结果。 -
我找到了问题的主要原因:self.model.create(...应该是self.create(...
标签: javascript node.js mongodb mongoose promise