【问题标题】:busboy on field and on file not firing现场和档案中的杂工没有开火
【发布时间】:2022-02-04 05:31:14
【问题描述】:

它昨天工作,现在它停止了,没有对代码进行任何更改。怎么回事?

客户

async function uploadFile(file) {
    let formData = new FormData();

    formData.append("recordUid", recordUid);
    formData.append("fieldUid", fieldUid);
    formData.append("file", file);

    await fetchPostFormData("/api/files", formData);
}

async function fetchPostFormData(url, formData) {);
    try {
        let result = await (
            await fetch(url, {
                method: "POST",
                withCredentials: true,
                credentials: "include",
                headers: {
                    Authorization: localStorage.getItem("token"),
                },
                body: formData,
            })
        ).json();

        return result;
    } catch (err) {
        return err;
    }
}

服务器

router.post("/api/files", async (req, res, next) => {
    try {
        console.log("starting upload..."); // <------------------- THIS ONE IS LOGGED

        let bb = busboy({
            headers: req.headers,
            limits: {
                fileSize: 20 * 1024 * 1024, // 20 mb
            },
        });

        let fields = {};

        // Get any text values
        bb.on("field", (fieldname, val, fieldnameTruncated, valTruncated) => {

            console.log("on.field", fieldname, val); // <------------------ NOT FIRING

            fields[fieldname] = val;
        });

        bb.on("file", (fieldname, file, filename, encoding, mimetype) => {

            console.log("on.file"); // <----------------------------------- NOT FIRING

            let parts = filename.filename.split(".");
            let name = parts[0];
            let extension = parts[parts.length - 1];

            let finalName = `${+new Date()}-${name}.${extension}`;
            let filePath = `${filesFolderPath}${finalName}`;

            // Open writeable stream to path
            let writeStream = fs.createWriteStream(filePath);

            // Pipe the file to the opened stream
            file.pipe(writeStream);

            // Check for errors
            writeStream.on("error", (err) => {
                console.log(err);
            });

            writeStream.on("close", async (err) => {
                let sizeBytes = fs.statSync(filePath).size;
            });
        });

        bb.on("finish", () => {
            res.status(200).send({ success: true });
        });
    } catch (err) {
        next(err);
    }
});

【问题讨论】:

  • 您能看到任何错误或警告吗?
  • 没什么。它只记录starting upload...,仅此而已。就好像它甚至没有进入其他代码。即使有错误,它仍然会记录其他内容。 Multer 也发生了同样的事情,它在引擎盖下使用了 busboy。这让我发疯了,这没有任何意义,因为它以前工作过。

标签: node.js express file-upload busboy


【解决方案1】:

设法解决它。

问题是最后缺少req.pipe(bb)

        // previous code... ^^^^^

        bb.on("finish", () => {
            res.status(200).send({ success: true });
        });

        req.pipe(bb)  // <------------- THIS SHIT RIGHT HERE

    } catch (err) {
        next(err);
    }
});

【讨论】:

    猜你喜欢
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多