0

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

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 没有找到游戏服务器,它不会在“结束”语句之后停止,而是返回(带有空值),所以我在“gameServer.beginner_properties”中得到一个节点异常或“gameServer.advanced_properties”。

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

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

4

2 回答 2

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基本上充当过滤器:如果游戏类型未知,它将结束请求,否则它将让请求通过,以便由您的路线处理。

于 2013-05-20T12:57:57.913 回答
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);
    });
    ...
});
于 2013-05-20T12:47:40.853 回答