2016-06-16 7 views
0

現在、node.jsexpress.jsを使用してAPIサーバを開発中です。私は、各APIがどれくらいの時間応答するかについての情報を知りたい。そのために、私はresponse-timeを使って時間を取っています。同じノードアプリケーションからres.json()データを取得する

app.use(responseTime(function(req, res, time) { 
    var log = { 
    "date" : new Date(), 
    "os" : req.headers['user-agent'],     
    "requestUrl" : req.originalUrl, 
    "ipAddress" : req.ip, 
    "requestMethod" : req.method, 
    "statusCode" : res.statusCode, 
    "statusMessage" : "", 
    "timeTaken" : Math.floor(time), 
    "data" : JSON.stringify(req.body) 
    }; 
    // save log data 
})); 

APIレスポンスごとに、jsonメソッドを使用してエラー番号res.status(400).json({message: 'Something'})を返します。

responseTimeの内部にあるjsonエラーメッセージを再取得するにはどうすればよいですか?

答えて

2

残念ながら、私はこのミドルウェアでは可能ではないと思います。 response-timeミドルウェアは、ボディが応答オブジェクトに設定される前に、ヘッダが送信される(using onHeaders)直前のタイミングを停止します。私はボディがレスポンスオブジェクトに設定されているかどうかはまだ分かりません。

mungのようなものを `応答時間?

1

レスポンスボディがレスポンスオブジェクトに決して設定されていないため、このようにアクセスできない理由があります。代わりに、クライアントに直接ストリーミングされます。したがって、レスポンス・ボディをレスポンス・オブジェクトに手動で収集する必要があります。

最も簡単な解決策は、応答オブジェクト内のカスタムフィールドに常にボディ(エラーjsonの場合)を渡すことです。あなたのルートでたとえば、次のようなものを追加します。

get('/myErrorRoute', function(req, res, next) { 
    var errJson = {message: 'Something'}; 
    res.myCustomField = errJson; 
    res.status(400).json(errJson); 
}); 

次に、このようなあなたのミドルウェアでアクセス:

app.use(responseTime(function(req, res, time) { 
    var log = { 
    "date" : new Date(), 
    "os" : req.headers['user-agent'],     
    "requestUrl" : req.originalUrl, 
    "ipAddress" : req.ip, 
    "requestMethod" : req.method, 
    "statusCode" : res.statusCode, 
    "statusMessage" : "", 
    "timeTaken" : Math.floor(time), 
    "data" : JSON.stringify(req.body) 
    }; 
    // acces your custom field 
    console.log(res.myCustomField); 
})); 

それとも、大胆であれば、猿はそうすることをJSON()メソッドにパッチを適用。 example here

関連する問題