我正在构建一个 sails.js api,使用 MongoDb 作为我的数据库。
这些是我的模型(只是为了这个问题而简化):
models/Passport.js
简化:
identifier: {
type: 'string'
},
owner: {
model: 'User',
required: true
},
models/User.js
简化:
username: {
type: 'string',
unique: true
},
passports: {
collection: 'Passport',
via: 'owner'
}
问题
在 sails.js 服务 login
函数中,我首先尝试通过 User
集合中的用户名获取用户。
sails.models.user.findOne({username: 'demo'}).exec(function onExec(error, user) {
user; //contains user info
}
到目前为止一切顺利。
然后,当获取用户(成功)时,我获取他的 user.id 并尝试从 Passport 集合中获取他的护照。
sails.models.passport.findOne({owner:user.id}).exec(function onExec(error, passp) {
if(passp==undefined) //puppies dying in this line!!!!
throw new Error('Can't find this passport');
}
}
返回的passp
对象未定义。
什么...为什么?
其他信息:
在我的 mongo shell 中运行 > db.passport.find({owner:"theCorrectUserId"})
确实会返回正确的护照,因此这不是 id 不正确的问题,而且运行:
sails.models.passport.find().exec(function onExec(error, passports) {
passports; //does contain all my passports
}
确实包含我所有的护照。因此它也不是编程错误!
顿悟时刻:
经过几个小时的努力,我发现删除关联,从而使我的模型像这样:
models/Passport.js
简化:
identifier: {
type: 'string'
},
owner: {
type: 'string'
required: true
}
models/User.js
简化:
username: {
type: 'string',
unique: true
}
确实解决了问题,并使我的 passp
对象获取正确的数据..
我使用水线关联是否错误?但是当关联存在时,为什么它在 mongo shell 中可以工作呢?
因为我在服务中使用了 2 个不同的查询,所以我是否还需要关联?性能怎么样?
最佳答案
让我们使用第一个模型架构。
这就是你应该如何使用 Waterline 来做到这一点:
sails.models.user
.findOne({ username: username })
// The populate method allows you to get associated data
.populate('passports')
.exec(function (err, user) {
// Handle errors
if(err) return next('An unknown error has occured');
if(!user) return next('Can\'t find this user');
if(!user.passports || !user.passports.length)
return next('This user has no passports');
// The User has at least one passport
...
return next(null, user);
}
next
方法将带您返回 Controller 。以下是您应该如何使用您的服务:
sails.services.myService
.login(username, password, function (err, user) {
...
});
如您所见,只剩下一个查询:-)。
这里是关于 associations with the Sails ORM 的文档.
关于node.js - 当不存在 Waterline 关联时 Sails 服务返回 MongoDb 结果,但当它们存在时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30482378/