如何在Sails.js中正确调试响应生命周期?

时间:2015-06-18 22:13:12

标签: node.js sails.js sails-mongo

使用sails.js我得到了这些执行db请求和使用promises的控制器方法。问题是它们正在工作,但是当执行请求时,在客户端获得504。

我想确保我的实现很好并且504在sails / node编码中不是问题,而是任何nginx或其他东西。我在config/logs.js中将日志模式设置为愚蠢但我每次调用response.send时都看不到。

这两种方法都存在这样的问题但是(可能是巧合)第一种方法有时只会发生。

方法1

addPlayer: function (request,response) {

console.log("Add player");
var lineupId = request.params.id;

var receivedPlayer = request.param('player');
var playerId = receivedPlayer.id;
var bench = receivedPlayer.bench;
var place = receivedPlayer.place;

LineUp.findOne().where({id: lineupId}).then(function (foundLineUp) {

  var player = Player.findOne().where({id: playerId}).then(function (player) {
    console.log("Found player with _id " + player.id);
    return player;
  });

  return [foundLineUp,player];

  }).spread(function (lineup,player) {

    if (!lineup)
      return response.send(404);

    if (!player)
      return response.send(409, "El jugador " + playerId + " no existe");

    else if (!lineup.formation)
      return response.send(409, "No se ha elegido una táctica para esta alineación");

    if (lineup.squadIsComplete())
      return response.send(409, "La plantilla ya contiene el máximo de 15 jugadores");

    if (lineup.playerWasAdded(player.id))
      return response.send(409, "El jugador ya ha sido agregado a la alineación");

    if (lineup.fieldIsComplete() && !bench)
      response.send(409, "Ya se han agregado los 11 jugadores de campo");

    /*If there's already a player with same position, return 409, should modify*/

    player.bench = bench;
    player.place = place;

    lineup.players.push(player);

    /*
        MISSING: Add field or bench player and rearrange squad
    */

    // If any of rule restrictions evaluates to true ...
    // Using lodash _.some with out second argument which defaults to _.identity
    if ( _.some([ lineup.reachesMaxForeignPlayers(),
                  lineup.reachesBudgetLimit(),
                  lineup.reachesMaxSameTeamLimit(),
                  lineup.reachesMaxSameFavoriteTeamLimit()]) ) {

      response.send(400, "La inclusión de este jugador no satisface las reglas del juego");
    }

    // Whole rule validations passed through
    else {
      lineup.save().then(function (saved) {

        // Pluck missing, valid while DEV
        return response.send(202,JSON.stringify(saved));
      });
    }
  }).
  catch(function (err) {

    console.log(err);
    response.send(500,JSON.stringify(err));
  })

}

方法2

deletePlayer: function (request,response) {

  console.log("deletePlayer");

  var lineupId = request.param('id');
  var playerId = request.param('player');

  LineUp.findOne().where({id: lineupId}).then(function (foundLineUp) {
    _.remove(foundLineUp.players, function(player) {
      console.log(player.id + " || " + playerId);
      return player.id === playerId;
    });

    console.log("Ended remove");

    foundLineUp.save().then(function (savedLineup) {

      console.log("Saved lineup\n\n:" + JSON.stringify(savedLineup));
      return response.send(202, JSON.stringify(savedLineup));
    }).catch(function (err) {

      console.log("save lineup err");
      response.send(500, JSON.stringify(err));
    });
  }).catch(function (err) {
    console.log(err);
    return response.send(500, JSON.stringify(err));
  });
}

2 个答案:

答案 0 :(得分:2)

我认为这是暂停,因为你没有回复你在诺言中解决的内容:



addPlayer: function(request, response) {

    console.log("Add player");
    var lineupId = request.params.id;

    var receivedPlayer = request.param('player');
    var playerId = receivedPlayer.id;
    var bench = receivedPlayer.bench;
    var place = receivedPlayer.place;

    return LineUp.findOne().where({
        id: lineupId
    }).then(function(foundLineUp) {
        
        return Player.findOne().where({
            id: playerId
        }).then(function(player) {
            console.log("Found player with _id " + player.id);
            return [foundLineUp, player];
        });

    }).spread(function(lineup, player) {

        if (!lineup)
            return response.send(404);

        if (!player)
            return response.send(409, "El jugador " + playerId + " no existe");

        else if (!lineup.formation)
            return response.send(409, "No se ha elegido una táctica para esta alineación");

        if (lineup.squadIsComplete())
            return response.send(409, "La plantilla ya contiene el máximo de 15 jugadores");

        if (lineup.playerWasAdded(player.id))
            return response.send(409, "El jugador ya ha sido agregado a la alineación");

        if (lineup.fieldIsComplete() && !bench)
            response.send(409, "Ya se han agregado los 11 jugadores de campo");

        /*If there's already a player with same position, return 409, should modify*/

        player.bench = bench;
        player.place = place;

        lineup.players.push(player);

        /*
            MISSING: Add field or bench player and rearrange squad
        */

        // If any of rule restrictions evaluates to true ...
        // Using lodash _.some with out second argument which defaults to _.identity
        if (_.some([lineup.reachesMaxForeignPlayers(),
                lineup.reachesBudgetLimit(),
                lineup.reachesMaxSameTeamLimit(),
                lineup.reachesMaxSameFavoriteTeamLimit()
            ])) {

            response.send(400, "La inclusión de este jugador no satisface las reglas del juego");
        }

        // Whole rule validations passed through
        else {
            lineup.save().then(function(saved) {

                // Pluck missing, valid while DEV
                return response.send(202, JSON.stringify(saved));
            });
        }
    }).
    catch(function(err) {

        console.log(err);
        response.send(500, JSON.stringify(err));
    })

}




答案 1 :(得分:2)

在方法1中,您有:

LineUp.findOne().where({id: lineupId}).then(function (foundLineUp) {

      var player = Player.findOne().where({id: playerId}).then(function (player) {
        console.log("Found player with _id " + player.id);
        return player;
      });

      return [foundLineUp,player];

      }).spread(function (lineup,player){...

当你致电'然后'在:

var player = Player.findOne().where({id: playerId}).then(...)

您正在返回'播放器',但它会在回调正文中返回。

这并不意味着这将在行之前执行:

return [foundLineUp,player];

这是' spread'的输入。

这应该有效:

LineUp.findOne().where({
        id: lineupId
    }).then(function(foundLineUp) {

        return Player.findOne().where({
            id: playerId
        }).then(function(player) {
            console.log("Found player with _id " + player.id);
            return [foundLineUp, player];
        });

    }).spread(function(lineup, player) {....

在这里,您正在等待解决承诺,并在数组中返回播放器和阵容值,因此传播可以继续。