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服务loginfunction中,我首先尝试从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})