如何正确debuggingSails.js中的响应lifecyle?

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

我想确保我的实现是好的,504在sails /节点编码中不是问题,但是任何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)); }); } 

我认为这是一个暂停,因为你没有返回你在承诺中解决的问题:

 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中你有:

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

你正在返回'玩家',但它是在callback正文中返回。

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

return [foundLineUp,player];

这是“传播”的input。

这应该工作:

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

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