概要
私のカスタム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> at throwErrorWithCode (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/lib/validators.js:121:13)
<br> at Object.module.exports.validateAgainstSchema (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/lib/validators.js:176:7)
<br> at /Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/middleware/swagger-validator.js:143:22
<br> at /Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:356:13
<br> at async.forEachOf.async.eachOf (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:233:13)
<br> at _asyncMap (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:355:9)
<br> at Object.map (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/async/lib/async.js:337:20)
<br> at validateValue (/Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/middleware/swagger-validator.js:136:11)
<br> at /Users/cuv/Documents/dev/dev-project/dev-simple/node_modules/swagger-tools/middleware/swagger-validator.js:343:21
<br> 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
ありがとうございます!
は、あなたが問題を修正言及した最初の2つの変更を作るカスタムエラーの詳細!私はあなたのリンクであなたが参照しているものと一直線になるように私のエラー処理のメカニズムを補強する過程にあります。ありがとう、アイコン! –