Sails服务返回MongoDb的结果,当没有水线协会存在,但是当它们存在时失败
我正在用MongoDb构build一个sails.js api作为我的db。
这些是我的模型(为了这个问题而简化):
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
function中,我首先尝试从User
集合中获取用户名。
sails.models.user.findOne({username: 'demo'}).exec(function onExec(error, user) { user; //contains user info }
到现在为止还挺好。
然后,当用户被抓取(这是成功的),我抓住他的user.id,并尝试从护照集合取回他的护照。
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
对象是未定义的。 什么为什么?
附加信息:
运行> db.passport.find({owner:"theCorrectUserId"})
在我的mongoshell是否返回正确的护照,因此它不是一个不正确的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个不同的查询? 性能呢?
我们来使用第一个模型架构。
这是你应该如何与水线做的:
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
方法将把你带回你的控制器。 这里是你应该如何使用你的服务:
sails.services.myService .login(username, password, function (err, user) { ... });
正如你所看到的,只剩下一个查询:-)。
这里是与Sails ORM关联的文档。
而不是做:
sails.models.passport.findOne({owner:user.id})
尝试:
sails.models.passport.findOne({owner:user})