Sails.js使用Callback中的值设置模型值

时间:2014-01-06 11:47:38

标签: javascript node.js asynchronous sails.js

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

所以我的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() %>

肯定得到一个不确定的回报...

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

提前致谢!

2 个答案:

答案 0 :(得分:5)

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

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。

答案 1 :(得分:3)

所以这种模型之间关联的特殊情况。所以这里有一个User模型和ForumPost模型,你需要用户对象来代替你的user_id,因为user_id可以作为你的用户模型的关系映射字段。

因此,如果您使用的是风帆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上)下一版本的帆,因为他们在V0.10中宣布了关联,它现在处于beta测试阶段。