form-data 请求 body 为空
form-data request body is empty
我正在尝试将图像和一些数据从 API 发送到另一个。图像用 multer 存储在内存中。但是当我想发送它时,body 只是空的。我用邮递员尝试了同样的请求,它完美地工作了。
邮差测试
postman test image
服务器测试
server test image
这是一些代码。我删除了其中的一些内容以便您可以更好地阅读它
export const saveImage = async ({ image, name, folder, options }: { image: any, name?: any, folder: string, options?: any }) => {
try {
const fd = new FormData();
fd.append("image", image.buffer, image.originalname);
if(options) {
fd.append("options[resize][height]", options?.resize?.height);
fd.append("options[resize][width]", options?.resize?.width);
}
if(name) fd.append("name", name);
fd.append("folder", folder);
fd.append("servideId", IMAGES_ID);
fd.append("serviceSecret", IMAGES_SECRET);
console.log(fd)
const formHeaders = fd.getHeaders();
const request = await axios.post(`${IMAGES_URL}/api/images`, {
headers: formHeaders,
body: fd
});
return request.data.id;
} catch (error) {
const { response } = error;
console.log(response.request.data)
if(error?.response?.data?.error) {
throw { statusCode: error.response.status, message: error.response.data.error }
}
console.error("Images API", error);
throw new InternalError("Something gone wrong");
}
}
当我记录 FormData 时,我可以在 _streams 中看到我正在发送的数据,但是图像 API 收到一个空的 body。
FormData screenshot
如果您需要更多信息,请告诉我!谢谢
有了axios,可以直接使用表单数据,无需处理headers。
axios.post("/api/images", fd)
如果您希望在将来的某个时候修改 headers,您应该将 formData 传递给 `data` 字段而不是 `body`。
axios.post("/api/images", { headers: formHeaders, data: fd })
评论更正。
也可以使用 Axios API syntax 来完成。
axios({method: 'post', url: 'url', data: fd, headers: {} })
在后端,multer 会将您的文件添加到 req.file
而不是 req.body
,如果您已正确配置的话。
post 方法的 axios API 是:axios.post(url[, data[, config]])
。第二个参数 必须始终 是您发送的数据。
在你的情况下,axios 认为 { headers: formHeaders, body: fd }
是正文,请求最终是 application/json。要在 Node.js 中使用 axios 发送包含数据的文件,请执行以下操作:
const response = await axios.post(`${IMAGES_URL}/api/images`, fd, {
headers: {
...formHeaders,
'X-Custom-Header': 'lala', // optional
},
});
你的问题启发了我将这个答案写成一篇文章 — Send a File With Axios in Node.js。它涵盖了一些常见的陷阱,您将学习如何发送存储为缓冲区或来自流的文件。
我正在尝试将图像和一些数据从 API 发送到另一个。图像用 multer 存储在内存中。但是当我想发送它时,body 只是空的。我用邮递员尝试了同样的请求,它完美地工作了。
邮差测试 postman test image
服务器测试 server test image
这是一些代码。我删除了其中的一些内容以便您可以更好地阅读它
export const saveImage = async ({ image, name, folder, options }: { image: any, name?: any, folder: string, options?: any }) => {
try {
const fd = new FormData();
fd.append("image", image.buffer, image.originalname);
if(options) {
fd.append("options[resize][height]", options?.resize?.height);
fd.append("options[resize][width]", options?.resize?.width);
}
if(name) fd.append("name", name);
fd.append("folder", folder);
fd.append("servideId", IMAGES_ID);
fd.append("serviceSecret", IMAGES_SECRET);
console.log(fd)
const formHeaders = fd.getHeaders();
const request = await axios.post(`${IMAGES_URL}/api/images`, {
headers: formHeaders,
body: fd
});
return request.data.id;
} catch (error) {
const { response } = error;
console.log(response.request.data)
if(error?.response?.data?.error) {
throw { statusCode: error.response.status, message: error.response.data.error }
}
console.error("Images API", error);
throw new InternalError("Something gone wrong");
}
}
当我记录 FormData 时,我可以在 _streams 中看到我正在发送的数据,但是图像 API 收到一个空的 body。 FormData screenshot
如果您需要更多信息,请告诉我!谢谢
有了axios,可以直接使用表单数据,无需处理headers。
axios.post("/api/images", fd)
axios.post("/api/images", { headers: formHeaders, data: fd })
评论更正。
也可以使用 Axios API syntax 来完成。
axios({method: 'post', url: 'url', data: fd, headers: {} })
在后端,multer 会将您的文件添加到 req.file
而不是 req.body
,如果您已正确配置的话。
post 方法的 axios API 是:axios.post(url[, data[, config]])
。第二个参数 必须始终 是您发送的数据。
在你的情况下,axios 认为 { headers: formHeaders, body: fd }
是正文,请求最终是 application/json。要在 Node.js 中使用 axios 发送包含数据的文件,请执行以下操作:
const response = await axios.post(`${IMAGES_URL}/api/images`, fd, {
headers: {
...formHeaders,
'X-Custom-Header': 'lala', // optional
},
});
你的问题启发了我将这个答案写成一篇文章 — Send a File With Axios in Node.js。它涵盖了一些常见的陷阱,您将学习如何发送存储为缓冲区或来自流的文件。