【问题标题】:nextjs parse XLSX on API route from incoming requestnextjs 解析来自传入请求的 API 路由上的 XLSX
【发布时间】:2021-08-19 15:59:47
【问题描述】:

我一直在尝试通过将我的 XLSX 解析移动到 API 路由来减小我的 NextJS 包大小。它使用 npm xlsx (sheetjs) 包,并从选定的 XLSX 中提取 JSON。

我在前端做的是

let res;
let formData = new FormData();
formData.append("file", e.target.files[0]);

  try {
    res = await axios.post("/api/importExcel", formData);
  } catch (e) {
    createCriticalError(
      "Critical error during file reading from uploaded file!"
    );
  }

在 API 路由上,我无法使用 XLSX.read() 读取文件

我相信 NextJS 对传入的请求使用 body-parser,但我无法将传入的数据转换为数组缓冲区或任何 XLSX 的可读格式。

您对如何解决这个问题有什么建议吗?

我尝试了多种解决方案,最可行的似乎是这个,但它仍然不起作用

export default async function handler(req, res) {
  console.log(req.body);

  let arr;
  let file = req.body;
  let contentBuffer = await new Response(file).arrayBuffer();

  try {
    var data = new Uint8Array(contentBuffer);
    var workbook = XLSX.read(data, { type: "array" });
    var sheet = workbook.Sheets[workbook.SheetNames[0]];
    arr = XLSX.utils.sheet_to_json(sheet);
  } catch (e) {
    console.error("Error while reading the excel file");
    console.log({ ...e });
    res.status(500).json({ err: e });
  }

  res.status(200).json(arr);
}

【问题讨论】:

    标签: axios next.js xlsx body-parser sheetjs


    【解决方案1】:

    由于您要上传文件,您应该从disabling the body parser 开始以流的形式使用正文。

    我还建议使用像formidable 这样的第三方库来处理和解析表单数据。然后您就可以使用XLSX.read() 读取文件并将其转换为 JSON。

    import XLSX from "xlsx";
    import formidable from "formidable";
    
    // Disable `bodyParser` to consume as stream
    export const config = {
        api: {
            bodyParser: false
        }
    };
    
    export default async function handler(req, res) {
        const form = new formidable.IncomingForm();
    
        try {
            // Promisified `form.parse`
            const jsonData = await new Promise(function (resolve, reject) {
                form.parse(req, async (err, fields, files) => {
                    if (err) {
                        reject(err);
                        return;
                    }
    
                    try {
                        const workbook = XLSX.readFile(files.file.path);
                        const sheet = workbook.Sheets[workbook.SheetNames[0]];
                        const jsonSheet = XLSX.utils.sheet_to_json(sheet);
                        resolve(jsonSheet);
                    } catch (err) {
                        reject(err);
                    }
                });
            });
            
            return res.status(200).json(jsonData);
        } catch (err) {
            console.error("Error while parsing the form", err);
            return res.status(500).json({ error: err });
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-01-04
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 2022-10-15
      • 2012-10-07
      相关资源
      最近更新 更多