我有三个服务:
- React应用程序
- Node express网关
- 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中间件是按安装顺序运行的,因此即使您在路由器的根上安装了这些中间件功能,在代理路由匹配并被调用的情况下,它们也不会被调用。