Как СИНХРОННО считать файл в массив построчно в NodeJS?

Нужно считать файл построчно, каждую строку запихнуть в массив как очередной элемент. Далее выбирается рандомный элемент из полученного массива и экспортируется для употребления в синхронном коде.

Есть некоторый рабочий код (ниже), но он АСИНХРОННЫЙ, и он тупиковый - ничего не вытащищь наружу и не экспортируешь. А существует ли обычный метод? Или как сделать код ниже синхронным? Заранее спасибо!

function fileToArray(Object_) {
    return new Promise((resolve, reject) => {
        const rl = readline.createInterface({
            input: fs.createReadStream(Object_.file),
            crlfDelay: Infinity
        });
        rl.on('line', line => Object_.array.push(line));
        rl.on('close', () => resolve(Object_.array));
        rl.on('error', err => reject(err))
    });
}


Ответы (2 шт):

Автор решения: vsemozhebuty

Если файл небольшой, можно так:

const lines = fs.readFileSync('./file.txt', 'utf8').split(/\r?\n/);
→ Ссылка
Автор решения: nörbörnën

Есть некоторый рабочий код (ниже), но он АСИНХРОННЫЙ, и он тупиковый - ничего не вытащищь наружу и не экспортируешь.

Суждение о том, что код "тупиковый", - абсолютно неверное суждение, обусловленное незнанием базовых практик.

С вашим асинхронным построчным чтением файла очень легко работать:

const fs = require('fs');
const path = require('path');
const readline = require('readline');

{
  // callback version
  const filepath = path.join(__dirname, 'data.txt');
  fileToArray(filepath).then((arr) => console.log('cb', arr)).catch(console.error);
}

(async () => {
  // async version
  const filepath = path.join(__dirname, 'data.txt');
  const arr = await fileToArray(filepath);
  console.log('async', arr);
})();

async function fileToArray(filepath) {
  const input = fs.createReadStream(filepath);

  const res = await new Promise((resolve, reject) => {
    const strings = [];
    const rl = readline.createInterface({
      input,
      crlfDelay: Infinity
    });
    rl.on('line', (line) => strings.push(line));
    rl.once('close', () => resolve(strings));
    rl.once('error', (err) => reject(err));
  });

  return res;
}

Вывод в терминал:

[
  '[',        '{"a":1},',
  '{"b":1},', '{"c":1},',
  '{"d":1},', '{"e":1},',
  '{"f":1},', '{"j":1},',
  '{"h":1},', '{"i":1}',
  ']'
]
→ Ссылка