Как решить эту ошибку с помощью async?

Я начинаю с node.js и пытаюсь использовать try..catch с методами файловой системы. Вот что у меня есть:

let fs = require("fs");
const util = require('util');

let buf = new Buffer(1024);

const open = util.promisify(fs.open);
const read = util.promisify(fs.read);
const close = util.promisify(fs.close)

async function main(){
  console.info("Going to open an existing file");
  try{
    const fd = await open('input.txt', 'r+');
    console.info("File opened successfully!");
    console.info("Going to read the file");

    try{
      await read(fd, buf, 0, buf.length, 0);
      if (bytes > 0) 
         console.info(buf.slice(0, bytes).toString());
    }
    catch(e){
      console.info("Error");
   } 
 }
 catch(e){
   console.info("Error");
 }
} 
main();
console.info("Program ended");

Когда я выполняю, он переходит ко второму улову и ничего не печатает.

Как решить эту ошибку с помощью async?

Почему вы передаете все эти аргументы в read() вместо buffer = await read(fd);? Разве fs.readFile не нужен просто путь или буфер?

Mark 27.06.2018 20:42

не читать = readFile

Keith 27.06.2018 20:47

@Keith см. -> const read = util.promisify(fs.readFile);

Mark 27.06.2018 20:49

Да, я знаю, что с readFile это работает, но я хотел использовать только чтение

Jason Mort 27.06.2018 20:50

@JasonMort, я понимаю это, но read - это обещанная версия fs.readFile, поэтому вам нужно передавать аргументы в read, как и в readFile. Вы передаете ему 5 аргументов, почему? Вы можете использовать read() так: let buffer = await read(fd);

Mark 27.06.2018 20:53

Кроме того, где определяется bytes?

Mark 27.06.2018 20:56

Я отредактировал код, байты, которые, как я думал, возникнут в результате обратного вызова 'read'

Jason Mort 27.06.2018 20:58

Было бы полезно, если бы ваши сообщения об ошибках были более описательными. Попробуйте зарегистрировать e.message или просто e.

Anthony 27.06.2018 21:06

@Mark_M В самом деле, так что конечно это .. const read = util.promisify(fs.read); readFile не принимает дескриптор файла, он принимает имя файла ..

Keith 27.06.2018 21:28

@Keith да, редактирование сделало вещи намного яснее. К вашему сведению nodejs.org/docs/latest-v8.x/api/…: "путь <строка> | <Буфер> | <URL> | <целое число> имя файла или дескриптор файла" Я думаю, что это было так, начиная с версии 5.

Mark 27.06.2018 21:34

@Mark_M Я думаю, что вы упускаете мою точку зрения, игнорируйте fd, readFile не принимает смещения буфера, которые пытается сделать Op.

Keith 27.06.2018 22:00
Поведение ключевого слова "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
12
119
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

С вашим обновленным кодом единственная ошибка, которую я вижу, связана с необъявленной переменной bytes.

await read(fd, buf, 0, buf.length, 0); вернет значение, которое имеет:

{ 
  buffer: bufferData,
  bytesRead: numberOfBytes
} 

Итак, в вашем асинхронном коде вам нужно получить их и использовать их:

try{
  let ret = await read(fd, buf, 0, buf.length, 0);
  if (ret.bytesRead > 0) 
     console.info(buf.slice(0, ret.bytesRead).toString());
}

Конечно, вы также можете просто распечатать буфер, возвращенный из read().

Также будет полезно в блоках catch распечатать ошибки:

catch(e){
  console.info("Error", e);
} 

Кроме того, если вы хотите, чтобы console.info в конце был в нужное время, вы должны использовать что-то вроде:

main().then(() => console.info("Program ended")) ;

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