node.js - 当不存在 Waterline 关联时 Sails 服务返回 MongoDb 结果,但当它们存在时失败

标签 node.js mongodb sails.js waterline sails-mongo

我正在构建一个 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/

相关文章:

mongodb - 计算数组中元素的数量

node.js - NodeJS : How to stop a Sails MVC app?

javascript - 如何使用不同表中的列数据从其他表中获取数据?

mysql - 将 MySQL 变量与 Sequelize 结合使用

node.js - 在node.js中捕获请求url

node.js - 将数据从 Zapier 身份验证传输到触发器

javascript - 异步系列 : variable number of callbacks

node.js - gulp with nodemon,监视文件更改, "app crashed - waiting for file changes before starting"

mongodb - 使用最大子字段查询文档

sails.js - 在 Sails JS 响应中看不到 Id