【问题标题】:Sails.js Set model value with value from CallbackSails.js 使用回调中的值设置模型值
【发布时间】:2014-01-23 19:44:52
【问题描述】:

我需要在我的模型中提供类似关联的东西。所以我有一个名为 Posts 的模型,它有一个用户 ID,我想从这个用户名中获取用户名并显示它。

所以我的 ForumPosts.js 模型如下所示:

module.exports = {

  schema: true,

  attributes: {

    content: {
        type: 'text',
        required: true
    },

    forumTopicId: {
        type: 'text',
        required: true
    },

    userId: {
      type: 'integer',
      required: true
    },

    getUsername: function(){
      User.findOne(this.userId, function foundUser(err, user) {
        var username =  user.username;
      });
      console.log(username);
      return username;
    }
  }

};

我知道这个返回不起作用,因为它是异步的......但是我怎样才能在我的视图中显示它?目前我用以下方式检索值:

<%= forumPost.getUsername() %>

而且肯定会得到未定义的回报...

所以问题是:我怎样才能返回这个值 - 或者有比实例模型更好的解决方案吗?

提前致谢!

【问题讨论】:

  • Model.query(, , 回调);不工作,不知道为什么它无论如何都找不到模型...但是必须有一种方法可以通过回调超额返回...
  • Model.query(&lt;sql query&gt;, &lt;optional data&gt;, callback); 仅适用于 SQL DB。您使用的是哪个适配器?

标签: javascript node.js asynchronous sails.js


【解决方案1】:

在我的脑海中,您可以在渲染之前异步加载关联的用户:

loadUser: function(done){
  var that = this;

  User.findOne(this.userId, function foundUser(err, user) {
    if ((err)||(!user))
        return done(err);

    that.user = user;

    done(null);
  });
}

然后在您的控制器操作中:

module.exports = {
  index: function(req, res) {
    // Something yours…

    forumPost.loadUser(function(err) {
      if (err)
        return res.send(err, 500);

      return res.view({forumPost: forumPost});
    });
  }
}

在你看来:

<%= forumPost.user.username %>

这是一种快速而肮脏的方式。如需更可靠和长期的解决方案(目前仍在开发中),您可以通过 Associations API 查看 Sails v0.10.0 的 alpha。

【讨论】:

    【解决方案2】:

    因此,您的模型之间的关联尤其如此。因此,这里有一个 User 模型和 ForumPost 模型,并且您需要 user 对象代替您的 user_id,因为 user_id 用作到您的 User 模型的关系映射字段。

    因此,如果您使用的是 Sails V0.9.8 或更低版本,则需要在控制器中处理此逻辑,以便在视图中访问用户模型属性。

    在你的控制器中写下你的逻辑:

    model.export = {
          //your getForumPosts method
          getForumPosts : function(req,res){
             var filters = {};     
    
             forumPost.find(filters).done(function(err,posts){
                 if(err) return res.send(500,err);
                 // Considering only one post obj
                 posts = posts[0];
                 postByUser(posts.user_id,function(obj){
                     if(obj.status)
                     {
                        posts.user = obj.msg;
                        delete posts.user_id;
                        res.view({post:posts});
                     }
                     else
                     {
                        res.send(500,obj.msg);
                     }
                 });
    
             }
          }
    
        }
    
             function postByUser(user_id,cb){
                User.findOne(user_id).done(function(err,user){
                     if(err) return cb({status:false, msg:err});
    
                     if(user){
                       cb({status:true, msg:user});
                     }
                }
             }
    

    然后您可以在视图中访问您的帖子对象。

    否则,您可以继续关注(在 GitHub 上)sails 的下一个版本,因为他们已经在 V0.10 中宣布了关联,就像现在一样处于 beta 测试阶段。

    【讨论】:

    • 嘿,这几乎解决了它。但我有一个问题,我有多个论坛帖子,而不仅仅是一个。在您的示例中,您只能从一个帖子中获取用户并显示这个,但我在每个 otehr 下有多个帖子
    猜你喜欢
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2016-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多