我正在使用Vertx中的REST上传文件。我正在现有项目中实现这一点,因此已有很多路由定义。我有问题为我的上传路线定义身体处理程序。在现有的路由定义中,主体处理程序的第一个定义如下:
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
这应该为所有传入请求设置此正文处理程序。现在稍后在代码中我想为上传定义特殊的处理程序:
router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
但这不起作用。 BodyHandler不是“覆盖”。它只适用于我在“公共”主体处理程序之前首先定义上传定义。所以这对我有用:
router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
但是我想知道是否有办法首先定义公共处理程序,稍后一些路由可以定义另一个处理程序。感谢
答案 0 :(得分:2)
你不能"覆盖"处理程序。 BodyHandler
任务是在incomming请求中设置正确的处理程序并解析请求正文。这些事件只触发一次,所以如果你添加几个处理程序,只有匹配的第一个将能够处理事件。
您可能不需要让多个处理程序具有顶层级别,可以解析请求正文并在路由上下文中填充表单数据和文件上载属性。因此,如果您希望它的行为不同,请上传到不同的位置,您只需执行文件移动操作即可。
如果您需要完全不同的配置,则需要指定不相交的路线,例如:
router.post("/upload/path")
.handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
router.route("/something/else")
.handler(BodyHandler.create().setBodyLimit(1024*1024));
正如您所看到的那样,2台路由器不同,只有1路由器匹配,让您拥有正确的上传配置。
答案 1 :(得分:0)
我不认为这是可能的。我也在努力解决这个问题。根据我的经验,vert.x有一个匹配第一个可能的注册路由的路由匹配算法。这意味着如果你有
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
然后它将首先与router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
匹配,如果您尝试通过另一个正文处理程序运行请求,则会抛出错误。
以下情况:
router.post("/upload/path").handler(BodyHandler.create("/upload/dir").setBodyLimit(maxUploadSize));
router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
它将首先匹配您的身体处理程序而忽略另一个,因为它已经匹配了路径的一部分。
您可以在
中添加if子句router.route().handler(BodyHandler.create().setBodyLimit(1024*1024));
在"/upload/path"
上你只需要调用next()
而不是身体处理程序,但我不认为这是一个很好的解决方案。