使用MulterAzureStorage时req.body为空的问题求助
我们开发了一款应用,通过表单向Azure Blob存储发送信息与文件,采用MulterAzureStorage包实现该功能,同时搭配已验证可用的身份验证中间件。未同时启用二者时,req.body可正常获取包含文件的表单数据;但同时启用后,req.body为空,且文件未存入Blob存储容器。相关代码如下,恳请协助排查:
后端代码
const azureStorage = new MulterAzureStorage({ connectionString: AZURE_CONNECTION_STRING, accessKey: AZURE_ACCESS_KEY, accountName: AZURE_STORAGE_ACCOUNT_NAME, containerName: CONTAINER_NAME, blobName: BLOB_NAME, }); const upload = multer({ storage: azureStorage }); router.post('/verzoek',[auth,upload.any()], async (req, result) => { console.log(req.body) // 后续代码省略 }
前端请求代码
const request = new FormData(); // 填充request的代码省略 $.ajax({ async: true, method: 'POST', url: '/aanvragen/verzoek', data: request, cache: false, processData: false, contentType: false, xhr: function () { var xhr = new XMLHttpRequest(); return xhr; } }).done(function (result) { if (result == "Succes") { // 激活相关类 } else { // 提示弹窗 } }).fail(function (xhr, status) { // 错误提示 });
排查方向建议
检查身份验证中间件的请求体处理
身份验证中间件如果提前读取了请求流(比如使用express.json()或express.urlencoded()解析普通表单),会导致multer无法再读取multipart/form-data类型的请求体。确认auth中间件中没有消费请求流的操作,或者确保这些解析中间件只针对非multipart的请求生效。修正MulterAzureStorage的Blob名称配置
配置中blobName设为固定值时,所有上传文件会覆盖同一个Blob,可能造成“未存入”的假象。建议改为动态生成文件名:blobName: function(req, file, cb) { cb(null, `${Date.now()}-${file.originalname}`); }同时验证Azure存储的连接信息、容器权限是否正确,确认容器存在且有写入权限。
验证中间件执行流程
暂时将auth中间件替换为空中间件(比如(req, res, next) => next()),测试是否能正常获取req.body和上传文件,以此排除auth中间件的拦截或干扰问题。确认前端请求的完整性
在前端发送请求前,检查FormData是否正确添加了所有字段和文件;也可在后端通过调试工具查看请求头(确认Content-Type为multipart/form-data且包含正确的boundary)和请求体是否完整。
内容的提问来源于stack exchange,提问作者Martijn Noordhof

