在nodejs中以windows-1251编码格式下载文件

Downloading file in windows-1251 encoding format in nodejs

我想创建和下载 windows-1251 格式的文本文件。当我尝试使用下面的代码时,文件下载成功,但不幸的是,格式为 utf-8。关于我做错了什么有什么建议吗?

节点代码:


//node-version: v12.13.0
var iconv = require("iconv-lite");

//create txt file 
router.post("/to-text", (req, res) => {
  const arr = req.body.arr; //an array of objects

  var file2 = iconv
    .encodeStream("win1251")
    .pipe(fs.createWriteStream(`filepath`));

  file2.on("error", function (err) {
    return res.status(500).json(err);
  });

  arr.forEach(function (v) {
     const lastChar = v[1].slice(-1);
    if (lastChar === "я") {
      v[1] = v[1] + ".";
    }
    file2.write(v.join(",") + "\n");
  });
  file2.end();
  returnres.send(file2);
});

//dowload txt file
router.get("/download", (req, res) => {
  let file_path = `filepath`;
  res.download(file_path);
});

反应代码:


const getText = () => {
    let arr = [];
    const date = `PLU_${Moment().format("L").split(".").join("")}.txt`;
    productsList.map((e, idx) =>
          arr.push(
            Object.values({
              a: e.hotkey,
              b: e.name,
              c: "",
            })
          )
        );
    // first request to save as text in filepath
    Axios({
      method: "POST",
      url: "/myapi/to-text",
      data: {
        arr,
        date,
        type: prefixType.value,
      },
      responseType: "blob",
    })
      .then((data) => {
        return data.data;
      })
      .then((resp) => {
        closeModal();
        return Axios.get("myapi/download", {
          responseType: "blob",
          params: { date },
        })
          .then((res) => res.data)
          .then((response) => {
            const url = window.URL.createObjectURL(
              new Blob(
                [
                  response,
                ],
                {
                  type: "text/plain;charset=windows-1251",
                }
              )
            );
            const link = document.createElement("a");
            link.href = url;
            link.setAttribute("download", date);
            document.body.appendChild(link);
            link.click();
          });
      })
      .catch((err) => {
        ErrorAlert(err);
      });
  };

当 React 函数触发时,它首先在服务器端的文件路径中创建一个 txt 文件。然后使用第二个请求下载它。
要检查我使用的文件格式 Notepad++,只需在编辑器中打开它并查看右下角即可。
我猜想缺少一些小细节,无法正确转换文件,但我看不到它(提前致谢。

我找到了解决问题的办法。我只需要在循环内对它进行一次编码,同时将 .writing 编码到文件中,例如: file.write(iconv.encode(v.join(",") + "\n", "win1251")); 就是这样,在这个小操作之后,它将文件保存为 windows-1251。显然,以相同的格式下载。