Я начинаю с 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");
Когда я выполняю, он переходит ко второму улову и ничего не печатает.
Почему вы передаете все эти аргументы в read() вместо buffer = await read(fd);? Разве fs.readFile не нужен просто путь или буфер?
не читать = readFile
@Keith см. -> const read = util.promisify(fs.readFile);
Да, я знаю, что с readFile это работает, но я хотел использовать только чтение
@JasonMort, я понимаю это, но read - это обещанная версия fs.readFile, поэтому вам нужно передавать аргументы в read, как и в readFile. Вы передаете ему 5 аргументов, почему? Вы можете использовать read() так: let buffer = await read(fd);
Кроме того, где определяется bytes?
Я отредактировал код, байты, которые, как я думал, возникнут в результате обратного вызова 'read'
Было бы полезно, если бы ваши сообщения об ошибках были более описательными. Попробуйте зарегистрировать e.message или просто e.
@Mark_M В самом деле, так что конечно это .. const read = util.promisify(fs.read); readFile не принимает дескриптор файла, он принимает имя файла ..
@Keith да, редактирование сделало вещи намного яснее. К вашему сведению nodejs.org/docs/latest-v8.x/api/…: "путь <строка> | <Буфер> | <URL> | <целое число> имя файла или дескриптор файла" Я думаю, что это было так, начиная с версии 5.
@Mark_M Я думаю, что вы упускаете мою точку зрения, игнорируйте fd, readFile не принимает смещения буфера, которые пытается сделать Op.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


С вашим обновленным кодом единственная ошибка, которую я вижу, связана с необъявленной переменной 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")) ;
Возможный дубликат DeprecationWarning: вызов асинхронной функции без обратного вызова устарел. - как узнать, где находится "функция:"?