【问题标题】:Sails.js/waterline: Executing waterline queries in toJSON function of a model?Sails.js/waterline:在模型的 toJSON 函数中执行水线查询?
【发布时间】:2015-05-11 09:39:12
【问题描述】:

我有以下模型,假设它描述了一本书:

module.exports = {

    attributes: {
        name: {
            type: 'String',
            required: true
        },
        type: {
            type: 'string',
            required: true
        },
        book_id: {
            type: 'integer'
        }
    }
}

这里的'type'属性是书的类型,例如HorrorBook。我对 HorrorBooks、FantasyBooks 等有一个单独的模型,因为模型的结构彼此差异很大,它们有其他没有的字段等,这就是为什么我不能只使用一个通用的 Book-模型。 HorrorBook、FantasyBook 等都有自己的“id”字段,这意味着可以同时存在具有相同 id 的 HorrorBook 和 FantasyBook。在创建这本书时,我有一个 beforeCreate 函数,它还会根据书的“类型”属性在 HorrorBook 或 FantasyBook 中创建一个条目。

我想要做的是,在从前端查询 Book 时,我想将这本书的相关信息包含在一个“信息”属性中,例如一个 HorrorBook 条目。

toJSON: function() {
    var obj = this.toObject();
    switch (obj.type) {
        case 'HorrorBook':
            HorrorBook.find({id: obj.book_id})
                .exec(function(err, book_info) {
                    obj.book_info = book_info;
                    return obj;
                })
    }
}

但是,这会导致 toJSON 一直返回 null。我假设是异步查询使它太慢或什么的,所以它根本不会进入'return'调用。那么我该怎么办呢?有没有办法在我正在尝试的事情上取得成功,或者我应该以某种方式改变我的方法?

【问题讨论】:

    标签: asynchronous sails.js waterline


    【解决方案1】:

    我的假设是查询是异步的,所以它太慢了,所以它根本没有进入'return'调用。

    发生的情况是 toJSON() 已同步,它会返回来自 HorrorBook.find({id: obj.book_id}).exec() 的任何内容,undefined 听起来不错。

    如果您需要异步运行,最好的办法是创建一个异步 toJSON() instance method,例如(未测试):

    toJSONAsync: function(callback) {
      var obj = this.toObject();
      switch (obj.type) {
        case 'HorrorBook':
            HorrorBook.find({id: obj.book_id})
                .exec(function(err, book_info) {
                    obj.book_info = book_info;
                    callback (obj);
                })
      }
    }
    

    现在您可以通过以下方式获得结果:

    book.toJSONAsync(function(json){
      console.log(json);
    })
    

    【讨论】:

    • 我无法理解应该在何处以及如何使用第二个 sn-p。你能详细说明一下吗?
    • Fissio,第二个 sn-p 用于您当前调用.toJSON() 并获取null 的位置。 book 表示您使用 .find() 从数据库中检索到的记录。
    • 啊,我明白了 - 不幸的是,这并不能解决我的问题,因为我正在从前端发出像 localhost:1337/Book?type=HorrorBook&id=1 这样的请求,因此无法在那里执行查询。很抱歉之前不清楚我的情况。
    • 目前我觉得解决这个问题的最好方法就是为我想做的事情创建一个自己的控制器动作,尽管它可能会在前端造成一些麻烦。无论如何感谢您的回答!
    猜你喜欢
    • 2014-12-14
    • 2014-01-01
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多