swagger工具错误处理程序中间件没有捕获错误 [英] swagger tools error handler middleware not catching errors

查看:464
本文介绍了swagger工具错误处理程序中间件没有捕获错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

概述



我的自定义errorHandler中间件没有捕获swagger-tools请求验证器错误。而是将swagger tools HTML错误发送回客户端。我如何得到我的错误Handler中间件来捕捉swagger工具验证错误,并相应地响应客户?



我的预后



不幸的是我很无知。无论我在哪里放置app.use(errorHandler)指令,swagger工具html错误返回给客户端,我的errorHandler函数从不捕获错误。



也许我我忽略了我的设置的一些明显的错误。以下是我的app.js文件,下面我的app.js是返回给客户端的[不需要的] swagger-tools HTML错误响应。再次,尽管以下代码仅在两个地方显示,但我一直尝试将app.use(errorHandler)从字面上(比喻)放在一边。



应用程序。 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); //运行它来启用调试日志DEBUG = app-js node app.js

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

// Swagger文档(需要它,以编程方式构建,从URL中获取...)
var swaggerDoc = require('./ api / swagger / swagger.json );

//压缩除Non-transform指令
app.use(compression())的Cache-Control头之外的所有请求;

//测试
module.exports = app;

//全局错误处理程序
函数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 ||有些东西被炸毁,err对象未定义));
}
}

//处理超时请求
函数haltOnTimedout(req,res,next){
if(!req.timedout){
next();
} else {
debug(\\\
request timed out!\\\
);
next(请求超时,null,null,null,504);
}
}

//初始化Swagger中间件
swaggerTools.initializeMiddleware(swaggerDoc,function(middleware){
use strict

//解释Swagger资源并附加元数据请求 - 必须首先在swagger工具中间件链
app.use(middleware.swaggerMetadata());

应用程序。 use(function(req,res,next){
res.header(Access-Control-Allow-Origin,*); // CORS应该由配置参数化
res.header Access-Control-Allow-Headers,Origin,X-Requested-With,Content-Type,Accept);
next();
});

//验证Swagger请求
// app.use(middleware.swaggerValidator());

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

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

//将已验证的请求路由到适当的控制器
app.use(中dleware.swaggerRouter(选项));
});

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

app.listen(projectConfig.port || process.env.PORT || 9000)
.on(connection,function(socket){
debug( \\ n new cxn由客户端创建。\\\;
socket.setTimeout(projectConfig.expressTimeout || 120000);
})
/ pre>

swagger工具html错误返回给客户端



 错误:参数(复制)失败的模式验证
< 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;在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;在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

我正在运行什么版本?



节点:

 节点--version 
v6.2.2

最新版本的swagger-tools和express:

 swagger-tools:^ 0.10.1,
express:^ 4.12.3



关闭



任何帮助和/或深入了解如何让我的错误Handler中间件捕获,从而覆盖swagger-tools html错误将是非常有必要的。我也在apigee社区论坛发布了我的问题,因为它是一个apigee-127项目的一部分。
https://社区.apigee.com / questions / 29267 / swagger-tools-error-handler-middleware-not-catchin.html



谢谢!

解决方案

我看到两个问题。



起初:错误处理程序必须有4个参数,所以statusCode将被忽略。

  errorHandler(err,req,res,next)//正确定义

第二名是

  next(请求超时,null,null,null,504); 

错误句柄的第一个参数必须是Error对象不是String,所以正确的代码将是

  next(new Error(request timed out)); //其他通过闭包传递的参数

有很多变体如何传递statusCode。

  // 1.错误的方法:传递带分隔符的字符串
next(新的错误(请求超时; 404 ));
...
//在错误处理程序
var args = err.message.split()// => args [0] =请求超时,args [1] = 404

// 2.检查消息错误文本
如果(err.message =='请求超时)
statusCode = 404;

// 3.最好的方法是使用自定义错误

有关自定义的更多信息错误 这里


overview

My custom errorHandler middleware is not catching the swagger-tools request validator error. Instead, the swagger tools HTML error is sent back to the client. How can I get my errorHandler middleware to catch the swagger tools validation error and respond to the client accordingly?

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.

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

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": "^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. I've posted my question in the apigee community forums as well, as it is part of an apigee-127 project. 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.

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.

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

这篇关于swagger工具错误处理程序中间件没有捕获错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆