2016-07-28 10 views
3

概要

私のカスタムerrorHandlerミドルウェアは、swagger-toolsリクエストバリデータエラーをキャッチしていません。代わりに、swaggerツールのHTMLエラーがクライアントに返されます。どうやってerrorHandlerミドルウェアを取得して、ツールの検証エラーをキャッチし、それに応じてクライアントに応答することができますか?swaggerツールエラーハンドラミドルウェアがエラーをキャッチしない

私の予後

私は残念ながらかなり無知です。 app.use(errorHandler)ディレクティブをどこに置いても、swaggerツールのhtmlエラーはクライアントに返され、errorHandler関数はエラーをキャッチしません。

多分、私の設定について間違ったことを見落としているかもしれません。以下は私のapp.jsファイルです。私のapp.jsの下には、クライアントに返される[望ましくない] swagger-toolsのHTMLエラー応答があります。ここでも、私はapp.use(errorHandler)を文字通り(比喩的に)どこにでも配置しようとしましたが、以下のコードでは2つの場所にしか表示されません。

app.js

"use strict"; 

var swaggerTools = require("swagger-tools"); 
var compression = require("compression"); 
var app = require("express")(); 
var logger = require("./config/logger"); 
var projectConfig = require("./config/projectConfig"); 
var debug = require("debug")("app-js"); // run this to enable debug logging DEBUG=app-js node app.js 

// swaggerRouter configuration 
var options = { 
    controllers: './api/controllers', 
    useStubs: false 
}; 

// The Swagger document (require it, build it programmatically, fetch it from a URL, ...) 
var swaggerDoc = require('./api/swagger/swagger.json'); 

// compress all requests except those which have Cache-Control header with the no-transform directive 
app.use(compression()); 

// for testing 
module.exports = app; 

// global error handler 
function errorHandler(err, req, res, next, statusCode) { 
    logger.error(err); 
    debug(err); 
    if (res.headersSent) { 
     return next(err); 
    } else { 
     res.status(statusCode || 500).json(projectConfig.genericErrorResponse(statusCode || 500, err.message || err || "something blew up and the err object was undefined")); 
    } 
} 

// handles timed out requests 
function haltOnTimedout(req, res, next) { 
    if (!req.timedout) { 
     next(); 
    } else { 
     debug("\nrequest timed out!\n"); 
     next("the request timed out", null, null, null, 504); 
    } 
} 

// Initialize the Swagger middleware 
swaggerTools.initializeMiddleware(swaggerDoc, function (middleware) { 
    "use strict" 

    // Interpret Swagger resources and attach metadata to request - must be first in swagger-tools middleware chain 
    app.use(middleware.swaggerMetadata()); 

    app.use(function (req, res, next) { 
     res.header("Access-Control-Allow-Origin", "*"); // CORS should be parametrized by configuration 
     res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
     next(); 
    }); 

    // Validate Swagger requests 
    // app.use(middleware.swaggerValidator()); 

    app.use(middleware.swaggerValidator({ 
     validateResponse: false 
    })); 

    app.use(haltOnTimedout); 
    app.use(errorHandler); 

    // Route validated requests to appropriate controller 
    app.use(middleware.swaggerRouter(options)); 
}); 

app.use(haltOnTimedout); 
app.use(errorHandler); 

app.listen(projectConfig.port || process.env.PORT || 9000) 
    .on("connection", function (socket) { 
     debug("\na new cxn was made by a client.\n"); 
     socket.setTimeout(projectConfig.expressTimeout || 120000); 
    }) 

闊歩ツールのHTMLエラーは、私が何のバージョンを実行しているクライアントに

Error: Parameter (copy) failed schema validation 
<br> &nbsp; &nbsp;at throwErrorWithCode (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/lib/validators.js:121:13) 
<br> &nbsp; &nbsp;at Object.module.exports.validateAgainstSchema (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/lib/validators.js:176:7) 
<br> &nbsp; &nbsp;at /Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/middleware/swagger-validator.js:143:22 
<br> &nbsp; &nbsp;at /Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:356:13 
<br> &nbsp; &nbsp;at async.forEachOf.async.eachOf (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:233:13) 
<br> &nbsp; &nbsp;at _asyncMap (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:355:9) 
<br> &nbsp; &nbsp;at Object.map (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:337:20) 
<br> &nbsp; &nbsp;at validateValue (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/middleware/swagger-validator.js:136:11) 
<br> &nbsp; &nbsp;at /Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/middleware/swagger-validator.js:343:21 
<br> &nbsp; &nbsp;at /Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:356:13 

を返さ?

ノード:

node --version 
v6.2.2 

最新闊歩-ツールのバージョンと表現:

"swagger-tools": "^0.10.1", 
"express": "^4.12.3" 

近い

キャッチする私のErrorHandlerミドルウェアを取得する方法に任意のヘルプおよび/または洞察力とswagger-toolsのhtmlエラーを上書きすることは非常に義務付けられています。私は、apigee-127プロジェクトの一部であるので、私の質問をapigeeコミュニティフォーラムにも投稿しました。 https://community.apigee.com/questions/29267/swagger-tools-error-handler-middleware-not-catchin.html

ありがとうございます!

答えて

4

2つの問題があります。

まず、エラーハンドラには4つの引数が必要です。したがって、statusCodeは無視されます。

errorHandler(err, req, res, next) // correct definition 

2位には、エラー・ハンドルの

next("the request timed out", null, null, null, 504); 

最初の引数は、その正しいコードが

next(new Error("the request timed out")); // other args passed by closure 

からstatusCodeを渡すどのように多くのバリエーションがありますでしょうErrorオブジェクトではない文字列でなければなりません。

// 1. Bad way: Pass string with delimiter 
next(new Error("the request timed out;404")); 
... 
// In error handler 
var args = err.message.split() // => args[0] = the request timed out, args[1] = 404 

// 2. Check message error text 
If (err.message == 'the request timed out') 
    statusCode = 404; 

// 3. Best way is use custom error 

here

+0

は、あなたが問題を修正言及した最初の2つの変更を作るカスタムエラーの詳細!私はあなたのリンクであなたが参照しているものと一直線になるように私のエラー処理のメカニズムを補強する過程にあります。ありがとう、アイコン! –

関連する問題