我正在寻找有关如何使用 mongodb/mongoose
链接“查找或创建”功能的 promise 的建议。
我目前尝试过:
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
- 我不确定我使用的是正确的 promise 风格/最有效的编码风格
- 我是否正确处理了错误,例如仅在顶层,还是我需要在每个级别都处理错误
谁能看出我做错了什么,以及我如何才能做得更好?
谢谢。
更新
问题的原因是
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;
};
希望对你有帮助
关于javascript - Mongoose - 链接 promise ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27094523/