简体   繁体   English

swagger工具错误处理程序中间件没有捕获错误

[英]swagger tools error handler middleware not catching errors

overview 概观

My custom errorHandler middleware is not catching the swagger-tools request validator error. 我的自定义errorHandler中间件没有捕获到swagger-tools请求验证器错误。 Instead, the swagger tools HTML error is sent back to the client. 相反,将swagger工具HTML错误发送回客户端。 How can I get my errorHandler middleware to catch the swagger tools validation error and respond to the client accordingly? 如何让我的errorHandler中间件捕获swagger工具验证错误并相应地响应客户端?

my prognosis 我的预后

I'm rather clueless unfortunately. 不幸的是,我很无能为力。 No matter where I put the app.use(errorHandler) directive, the swagger tools html error is returned to the client and my errorHandler function never catches the error. 无论我在哪里放置app.use(errorHandler)指令,都会将swagger工具html错误返回给客户端,我的errorHandler函数永远不会捕获错误。

Maybe I'm overlooking something overtly incorrect about my setup. 也许我忽略了一些关于我的设置的错误。 Below is my app.js file and below my app.js is the [undesired] swagger-tools HTML error response that is returned to the client. 下面是我的app.js文件,在我的app.js下面是返回给客户端的[不受欢迎的] swagger-tools HTML错误响应。 Again, I have tried putting the app.use(errorHandler) literally (figuratively) everywhere, despite the fact that the below code only shows it in two places. 同样,我尝试将app.use(errorHandler)字面(比喻)放在任何地方,尽管以下代码仅在两个地方显示它。

app.js 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);
    })

swagger tools html error returned to client swagger工具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

what versions am i running? 我在跑什么版本?

node: 节点:

node --version
v6.2.2

latest versions of swagger-tools and express: 最新版本的swagger-tools和express:

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

close

Any help and/or insight into how to get my errorHandler middleware to catch and thereby override the swagger-tools html error would be very much obliged. 任何帮助和/或洞察如何让我的errorHandler中间件捕获并因此覆盖swagger-tools html错误将是非常有必要的。 I've posted my question in the apigee community forums as well, as it is part of an apigee-127 project. 我也在apigee社区论坛上发布了我的问题,因为它是apigee-127项目的一部分。 https://community.apigee.com/questions/29267/swagger-tools-error-handler-middleware-not-catchin.html https://community.apigee.com/questions/29267/swagger-tools-error-handler-middleware-not-catchin.html

Thanks! 谢谢!

I see two problems. 我看到两个问题。

At first: error handler must have 4 args, so statusCode will be ignored. 首先:错误处理程序必须有4个args,因此将忽略statusCode。

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

Second place is 第二名是

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

First argument of error handle must be Error object not String, so correct code will be 错误句柄的第一个参数必须是错误对象而不是字符串,因此正确的代码将是

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

There are many variants how pass statusCode. 传递statusCode有很多变种。

// 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

More about custom error here 更多关于自定义错误的信息

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM