节点文件系统 fs.writeFile() 在 JavaScript 模块中抛出错误

问题描述 投票:0回答:1

在我的 index.mjs 文件中,我有一个连接和缩小 JS 实用程序文件的函数。我是这样设置的:

import fs from "fs";
import { minify } from "terser";

function concatenateAndMinifyJsFiles() {
  const jsDir = "./js/";
  const mainJsFile = "./js/main.min.js";

  // Concatenate and minify .js files
  fs.readdir(jsDir, { withFileTypes: true }, (err, files) => {
    if (err) {
      console.error(`Error reading directory ${jsDir}: ${err}`);
      return;
    }

    const jsFiles = files.filter((file) => file.isFile() && file.name.endsWith(".js"));

    if (jsFiles.length === 0) {
      console.log(`No .js files found in ${jsDir}`);
      return;
    }

    const concatenatedJs = jsFiles.map((file) => fs.readFileSync(`${jsDir}${file.name}`, "utf8")).join("\n");
    const minifiedJs = minify(concatenatedJs).code;

    fs.writeFile(mainJsFile, minifiedJs, (err) => {
      if (err) {
        console.error(`Error writing file ${mainJsFile}: ${err}`);
      } else {
        console.log(`File ${mainJsFile} has been created`);
      }
    });
  });
}

我收到以下类型错误消息:

node:internal/fs/utils:885
  throw new ERR_INVALID_ARG_TYPE(
  ^

TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received undefined

一次注释掉每个部分后,似乎使用

writeFile
命令的部分:

fs.writeFile(mainJsFile, minifiedJs, (err) => {
  if (err) {
    console.error(`Error writing file ${mainJsFile}: ${err}`);
  } else {
    console.log(`File ${mainJsFile} has been created`);
  }
});

mainJsFile
值是一个字符串。 Terser minify 函数中的
minifiedJs
值也是一个字符串(来自
concatenatedJs
变量)。

我使用的是 Node 版本 16.15.1。我在代码中看不到任何与 Node 文档 不相称的内容。关于为什么会抛出这个错误有什么想法吗?

javascript node.js writefile node.js-fs
1个回答
0
投票

您从 fs 模块看到的错误是正确的。您为数据参数传递的值不是允许的类型之一。

根据 Terser 的文档(位于 https://www.npmjs.com/package/terser),minify 函数是异步的,因此您必须在调用之前添加

await
writeFile
调用会抱怨,因为数据类型实际上是
Promise<string>
,而不是
string

尝试使用以下方法:

const result = await minify(concatenatedJs);
const minifiedJs = result.code;

请注意我如何将其拆分为两个变量(主要是为了清楚起见),因为在等待结果之前您无法访问

code
属性。

© www.soinside.com 2019 - 2024. All rights reserved.