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 がゲーム サーバーを見つけられない場合、"end" ステートメントの後で停止せずに (null 値で) 戻るため、"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 に答える