在网关服务中使用express.json()时,req.file未定义



我有三个服务:

  1. React应用程序
  2. Node express网关
  3. Node express后端

我使用网关中的代理将文件从React应用程序发送到后端。问题是,如果express.json((或express.urlencoded((中间件在代理之前设置,则req.file在multer编码后为空。

相关代码:

react应用程序:

const formData = new FormData();
formData.append("file", file);
formData.append("type", "pdf");
formData.append("contentId", "srfewrgferg");
console.log(formData.get("file"));
axios.post( config.BASE_URL + "/activities/create", formData)

网关:

const router = express();
router.use(express.json());
router.use(express.urlencoded({ extended: true }));
router.post("/activities/*", proxy( `${config.urlPresupuestos}/`, { 
proxyReqPathResolver: ( req: Request ) => {
return req.originalUrl;
}
}));

后端:

const router = express();
router.use(multerMiddleware.single("file"));
router.post("/activities/create", (req, res) => {
console.log(req.file)
});

如果我删除网关中的express中间件,一切都很好,但我需要这些中间件用于其他路由。有什么建议可以说明为什么会发生这种情况?

我假设您正在使用express-http-proxy作为代理。

无论是错误还是有意设计,在代理之前包含主体解析中间件似乎都会破坏POST请求。

我不知道为什么这会破坏代理,但你通常可以通过简单地重新排序你的路由来解决这些问题,这样代理路由就在你的中间件之前定义了:

const router = express();
// Proxy routes go here
router.post("/activities/*", proxy( `${config.urlPresupuestos}/`, { 
proxyReqPathResolver: ( req: Request ) => {
return req.originalUrl;
}
}));
// Now install the middleware required by other routes
router.use(express.json());
router.use(express.urlencoded({ extended: true }));
// Other routes...
router.use(/*...*/);

Express中间件是按安装顺序运行的,因此即使您在路由器的根上安装了这些中间件功能,在代理路由匹配并被调用的情况下,它们也不会被调用。

最新更新