节点提取发送请求时未找到多个错误边界,但在与邮递员一起使用时有效

multer error boundary not found when request sent by node fetch but works when used with postman

我建立了我的节点 js 服务器来将我的图像保存到特定文件夹。当使用 Postman 发送请求时它工作正常但是当我使用 node-fetch 时它失败了。


// server.js

const express = require("express")
const bodyParser = require("body-parser");

const multer = require("multer");

const storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, "public/resources/icons");
    },
    filename: (req, file, cb) => {
        cb(null, Buffer.from([file.originalname, Date.now()].join("_")).toString("base64")+".png");
    }
})

const upload = multer({storage});

const server = express();

server.post("/api/putFile", upload.single("image"), (req, res, forward) => {

    if(req.file) {
        res.json(JSON.stringify({path: req.file.filename}));
    } else {
        res.status(400).send("bad file type given in form")
    }
    
    forward();
});

// server-utils.ts which is the file that requests to the server

export async function sendFile(file: File): Promise<{}> {
    const submitURL = "/api/putFile";
    const data: FormData = new FormData();


    const buffer = await file.arrayBuffer()
    data.append("image", Buffer.from(buffer).toString("binary"));

    return await fetch(submitURL, {
        method: "post",
        body: data,
        headers: {
            "Content-Type": "multipart/form-data",
        }

    }).then((response) => {
        return response.json();
    }).then(JSON.parse)

}

我也试过将 File 直接提交给 FormData : data.append("image", file) 但同样的错误发生了。

当我用邮递员 multipart/form-data 发送 Post 请求时,效果很好

首先,FormData必须从节点模块form-data导入,否则,fetch将无法将请求视为multipart/form-data。 然后必须删除 Content-Type header 以便 fetch auto 实现 Content-Type header.

这里是要更改的内容:

// server-utils.js

import fetch from "node-fetch"
import FormData from "form-data"

export async function sendFile(file: File): Promise<any> {
    const submitURL = "/api/putFile";
    const data: FormData = new FormData();

    data.append("image", file);

    return await fetch(submitURL, {
        method: "post",
        body: data,

    }).then((response) => {
        return response.json();
    }).then(JSON.parse)

}