2013-05-20 138 views
0

我有一個包含許多入口點的節點應用程序。所有入口點都需要根據請求參數提取遊戲服務器。如果服務器不存在,我想向用戶顯示錯誤消息,並結束請求。提前結束http請求

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函數中結束請求?

回答

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基本上作爲一個過濾器:它結束,如果遊戲類型不知道該請求,否則將讓該請求通過所以它將由您的路線處理。

+0

短,作品像一個魅力,謝謝! –

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); 
    }); 
    ... 
}); 
+1

慣用的解決方案是回調總是被調用,並且第一個參數是錯誤(如果有的話)。回調通常會啓動'if(err)next next(err);' –

+1

@RichardMarr OP顯式請求不檢查錯誤。但你的方式是絕對清潔 –