2017-01-21 9 views
1

Я пытаюсь сделать игру. Мне нужно создать матч. Я думаю, проблема на этом пути. Пользователь создает совпадение. В третьей таблице я сохраняю playerId и gameId. Когда другой пользователь присоединяется к матчу, я снова сохраняю playerId и gameId. Затем я делаю запрос с игроком с общей игрой и начинаю игру.Как сделать запросы, когда tou имеет много-много отношений между моделями?

первый, у одного пользователя может быть много игр. во-вторых, у 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.crea te отправить эту ошибку:

_http_outgoing.js: 344 throw new Error ('Can \' t установить заголовки после их отправки. ');^

Ошибка: не удается установить заголовки после их отправки.

Кто-нибудь может мне помочь? вероятно, у меня много ошибок. Благодарю.

ответ

1

Пар вещей здесь:

  1. Имея явную Game модели не требуется паруса. Он может управлять им неявно, если вы не хотите хранить больше информации, чем только gameId и userId. Итак, вы можете просто покончить с моделью Game.
  2. Пожалуйста, обратитесь к асинхронным программирования: How do I return the response from an asynchronous call?

Ниже код должен работать для вас. Надеюсь, поможет.

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); 
     }); 
    }); 
    } 
}; 
+0

Спасибо, друг, его работы отлично. Почему вы хотите хранить больше информации, чем gameId и userId вам нужна еще таблица? И в противном случае это не обязательно –

+0

Стол _join_ необходим для хранения многих и многих отношений между Match и User. Если только хранимая информация является 'matchId' и' userId' ('id' таблицы), то Sails управляет ею без явной модели. Однако, если в таблице соединений требуется больше атрибутов, Sails пока не поддерживает его. Таким образом, таблица соединений присутствует в обоих случаях, это просто случай объявления ее явно или фреймворк, управляющий им неявно. Много-много отношений: http://sailsjs.com/documentation/concepts/models-and-orm/associations/many-to-many – Sangharsh

 Смежные вопросы

  • Нет связанных вопросов^_^