Файловая система узла fs.writeFile() выдает ошибку в модуле JavaScript

В моем файле 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.info(`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.info(`File ${mainJsFile} has been created`);
      }
    });
  });
}

Я получаю следующее сообщение об ошибке TypeError:

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.info(`File ${mainJsFile} has been created`);
  }
});

Значение mainJsFile является строкой. Значение minifiedJs из функции минимизации Terser также является строкой (из переменной concatenatedJs).

Я использую Node версии 16.15.1. Я не вижу в своем коде ничего, что выглядело бы неуместно в документации Node. Есть мысли о том, почему выдается эта ошибка?

Является ли minifiedJs тем, что вы ожидаете?

Daniel A. White 19.05.2024 03:15
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ошибка, которую вы видите в модуле fs, верна. Значение, которое вы передаете в качестве аргумента данных, не является одним из разрешенных типов.

Согласно документации Terser по адресу https://www.npmjs.com/package/terser функция minify является асинхронной, и поэтому вы должны добавить await перед ее вызовом. Вызов writeFile вызывает жалобу, потому что на самом деле тип данных undefined, а не string. Это связано с тем, что вы пытаетесь получить доступ к свойству code промиса, которого не существует (и, следовательно, JavaScript оценивает его как неопределенное).

Попробуйте использовать следующее:

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

Обратите внимание, что я разделил это на две переменные (в основном для ясности), потому что вы не можете получить доступ к свойству code, пока не будет ожидан результат.

Редактировать: Как упоминал @jfriend00 в ответах на ответ, вам также необходимо пометить функцию, содержащую это ключевое слово await, как async. В вашем случае вам нужно будет пометить функцию обратного вызова для fs.readdir как асинхронную. Если вы этого не сделаете, вы получите сообщение об ошибке, поскольку вы не можете ожидать выполнения других асинхронных функций в неасинхронной функции.

fs.readdir(jsDir, { withFileTypes: true }, async (err, files) => {
    // your code here
});

Чтобы использовать await, содержащая функция также должна быть async.

jfriend00 19.05.2024 09:16

@jfriend00 Спасибо за заметку. Я обновил свой ответ, включив это.

Crazy Redd 19.05.2024 14:20

Другие вопросы по теме