Не удается увидеть данные из вновь созданного файла с помощью ‘fs.createWriteStream’

#javascript #node.js #ecmascript-6

#javascript #node.js #ecmascript-6

Вопрос:

У меня возникли проблемы с чтением данных из файла, созданного с помощью fs.createWriteStream.

Похоже, что stream.write выполняется в конце программы после чтения файла, а не при их вызове (что объясняет, почему во время его вывода в variable_3 ничего нет).

Используемая функция выглядит следующим образом (упрощенно):

 module.exports = async data1 => {
    console.log('start');
    try {
        const stream = fs.createWriteStream(filename_1, { flags: "a" });
        console.log('stream created');
        stream.write("some data", (err) => {
            if (err) {
                console.log(err.message);
            } else {
                console.log("data written");
            }
        });

        for (const variable_1 of object_1) {
            const variable_2 = await function2({
                // generates a buffer
            });
            stream.write(variable_2, (err) => {
                if (err) {
                    console.log(err.message);
                } else {
                    console.log("data written");
                }
            });
        }

        stream.end();
        console.log('stream ended');

        console.log('opening file');
        const variable_3 = fs.readFileSync(filename_1);
        console.log('file opened and read with data: '   variable_3);
        return;
    } catch (error) {
        console.log(error);
    }
};
  
 Output:
> start
> stream created
> stream ended
> opening file
> file opened and read with data: 
> data written
> data written
  

Однако после запуска кода, когда я открываю filename_1 (через проводник), все данные присутствуют ?!

Комментарии:

1. await stream.end(); не имеет особого смысла. end функция не возвращает обещание. Вместо этого выполняется обратный вызов. То же самое для await stream.write(variable_2) . write возвращает флаг, если вам следует дождаться события drain или продолжить запись.

2. Спасибо, что указали на это. Я отредактировал OP. Есть ли у вас какие-либо предложения относительно недоступности данных при запросе в console.log(variable_3) ?

3. После дополнительных исследований я обнаружил, что данные, похоже, записываются в конце программы, а не при вызове. Я обновил сообщение, чтобы отразить изменения.

Ответ №1:

В конце концов все разобрал.

Не понял, что потоковые функции не возвращают обещание, поэтому мне пришлось вручную вернуть обещание.

Вот измененный код:

 module.exports = async data1 => {
    console.log('start');
    try {
        const stream = fs.createWriteStream(filename_1, { flags: "a" });
        console.log('stream created');
        stream.write("some data", (err) => {
            if (err) {
                console.log(err.message);
            } else {
                console.log("data written");
            }
        });

        for (const variable_1 of object_1) {
            const variable_2 = await function2({
                // generates a buffer
            });
            stream.write(variable_2, (err) => {
                if (err) {
                    console.log(err.message);
                } else {
                    console.log("data written");
                }
            });
        }

        stream.end();
        console.log('stream ended');

        console.log('opening file');
        const variable_3 = fs.readFileSync(filename_1);
        console.log('file opened and read with data: '   variable_3);

        return new Promise(resolve => {
          stream.on('finish', () => {
              resolve('done');
              console.log("createNRRD is done");
          });
        });
    } catch (error) {
        console.log(error);
    }
};