我有一个包含许多入口点的节点应用程序。所有入口点都需要根据请求参数获取游戏服务器。如果服务器不存在,我想向用户显示错误消息,并结束请求。
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函数中结束请求?
答案 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);
});
...
});