如何在搜索时进行查询,模型之间有多对多的关系?

时间:2017-01-21 15:25:46

标签: sails.js

我正在尝试制作游戏。我需要创建一个匹配。我认为这个问题就是这个问题。用户创建匹配。在第三个表中,我保存了playerId和gameId。当另一个用户加入比赛时,我再次保存,playerId和gameId。然后,我与玩家一起使用gameId进行查询,然后开始游戏。

首先,一个用户可能有很多游戏。第二,One Match可能有很多游戏。这是匹配模型:

module.exports = {

  attributes: {

    name: {
        type: 'string'
    },

    description: {
        type: 'string'
    },

    game: {
        collection: 'game',
        via: 'gameId',
    }

  }
};

这是用户模型:

var bcrypt = require('bcrypt');

module.exports = {

  attributes: {

    name: {
        type:'string'
    },

    email: {
        type: 'email',
        required: true,
        unique: true
    },

    password: {
        type: 'string',
    },

    passwordConfirmation: {
        type: 'string'
    },

    passwordEncrypted: {
        type: 'string'
    },

    creator: {
      collection: 'game',
      via: 'playerId'
    },

    toJSON: function(){
        var obj = this.toObject();
        delete obj.password;
        delete obj.passwordConfirmation;
        delete obj._csrf;
        return obj;
    }
  }, beforeCreate: function(values, next){
        console.log("Acabo de entrar a eforeCreate");
        var password = values.password;
        var passwordConfirmation = values.passwordConfirmation;

        if(!password || !passwordConfirmation || password != values.passwordConfirmation) {
            var passwordDoesNotMatchError = [{
            name: 'passwordDoesNotMatchError',
            message: 'Las contraseñas deben coincidir'
        }]
        return next({
            err: passwordDoesNotMatchError
            });
        }

        require('bcrypt').hash(values.password, 10, function passwordEncrypted(err, EncryptedPassword){
            values.EncryptedPassword = EncryptedPassword;
            next();
        });
    }
};

这是游戏模型:

module.exports = {

  attributes: {

    gameId: {
        model: 'match'
    },

    playerId: {
        model: 'user'
    }



  }
};

最后,这是我的控制器:

module.exports = {

createMatch: function(req,res){

        var matchObj = {
            name: req.param('name'),
            description: req.param('description'),
        }


        Match.create(matchObj, function(err, match){
            if(err){
                console.log("el error fue: " + err);
                return res.send(err);
                } console.log("Entro en create");
                 return res.json(match);
        })

        var gameObj = {
            gameId: 'aclaration: I dont know how do I get the match.id',
            playerId: req.session.me
        }

        Game.create(gameObj,function(err,game){
            console.log("entro a GameCreate");
            if(err){
                return res.send(err);
            } return res.json(game);
        })
    }


};

我可以创建匹配,但Game.create会发送此错误:

_http_outgoing.js:344抛出新错误('在发送后无法设置标头。'); ^

错误:发送后无法设置标头。

有人可以帮助我吗?可能,我有很多错误。感谢。

1 个答案:

答案 0 :(得分:1)

这里有几件事:

  1. Sails中不需要具有明确的Game模型。它可以隐式管理它,除非您想要存储的信息不仅仅是gameIduserId。所以,你可以放弃Game模型。
  2. 请参阅异步编程:How do I return the response from an asynchronous call?
  3. 下面的代码应该适合你。希望它有所帮助。

    module.exports = {
      createMatch: function(req, res) {
        var matchObj = {
          name: req.param('name'),
          description: req.param('description'),
        };
    
        Match.create(matchObj, function(err, match) {
          if (err) {
            console.log("el error fue: " + err);
            return res.send(err);
          }
          console.log("Entro en create");
    
          var gameObj = {
            gameId: match.id,
            playerId: req.session.me
          };
    
          Game.create(gameObj, function(err, game) {
            console.log("entro a GameCreate");
            if (err) {
              return res.send(err);
            }
            return res.json(game);
            // return res.json(match);
          });
        });
      }
    };