过早地结束http请求

时间:2013-05-20 12:27:03

标签: node.js

我有一个包含许多入口点的节点应用程序。所有入口点都需要根据请求参数获取游戏服务器。如果服务器不存在,我想向用户显示错误消息,并结束请求。

function getGameServer(gametype, httpResponse) {
    if (gameServers[gametype])
        return gameServers[gametype];
    else 
        httpResponse.end("Unknown game type '"+gametype+"'");
}

....


app.get('/:gametype/beginner', function(req,res) {
    var gameServer = getGameServer(req.params.gametype, res);
    console.log(gameServer.beginner_properties);
    ...
});

app.get('/:gametype/advanced', function(req,res) {
    var gameServer = getGameServer(req.params.gametype, res);
    console.log(gameServer.advanced_properties);
    ...
});

问题是,如果函数getGameServer找不到游戏服务器,它不会在“end”语句之后停止,而是返回(带有空值),因此我在“gameServer”中得到一个节点异常.beginner_properties“或”gameServer.advanced_properties“。

当然我可以检查每个“.get”函数的返回值,但是,有很多这样的函数,检查每个函数的值是很繁琐的。

有没有办法从getGameServer函数中结束请求?

2 个答案:

答案 0 :(得分:3)

我会将getGameServer作为中间件:

function getGameServer(req, res, next) {
  var gametype          = req.params.gametype;
  res.locals.gameserver = gameServers[gametype];

  if (! res.locals.gameserver)
    return res.end('Unknown game type "' + gametype + '"'); // end the request
  next(); // this will call the next-in-line handler, which is your route handler below
}

app.get('/:gametype/beginner', getGameServer, function(req, res) {
  console.log('server', res.locals.gameserver);
  ...
});

app.get('/:gametype/advanced', getGameServer, function(req, res) {
  ...
});

getGameServer基本上充当过滤器:如果游戏类型未知,它会结束请求,否则会让请求通过,以便路由处理。

答案 1 :(得分:1)

您可以重构getGameServer以向其传递回调,并且仅在服务器存在时才调用它。

function getGameServer(gametype, httpResponse, callback) {
    if (gameServers[gametype])
        callback(httpResponse, gameServers[gametype]);
    else 
        httpResponse.end("Unknown game type '"+gametype+"'");
}
....


app.get('/:gametype/beginner', function(req,res) {
    getGameServer(req.params.gametype, res, function(res, gameServer) {
        console.log(gameServer.beginner_properties);
    });
    ...
});