【问题标题】:How to properly debug the response lifecyle in Sails.js?如何正确调试 Sails.js 中的响应生命周期?
【发布时间】:2015-06-18 22:13:11
【问题描述】:

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

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

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

方法一

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

}

方法二

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

【问题讨论】:

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


    【解决方案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;
    
        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));
        })
    
    }

    【讨论】:

    • 我在比较我的和你的建议,我会测试一下。你能解释一下我做错了什么/哪里做错了吗?
    【解决方案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){...
    

    当你调用 'then' 时:

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

    您正在返回“玩家”,但它在回调正文中返回。

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

    return [foundLineUp,player];

    这是“传播”的输入。

    这应该可行:

    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) {....
    

    在这里,您正在等待解决承诺,并以数组的形式返回球员和阵容值,因此可以继续传播。

    【讨论】:

      猜你喜欢
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2012-12-19
      • 1970-01-01
      相关资源
      最近更新 更多