#javascript #node.js
Вопрос:
Я пытался получить пример работы util.promisify на узле (v 14), и ни за что на свете я не могу заставить работать ни один из примеров, доступных в Интернете.
это, например, очень простой пример с веб-сайта, который должен работать, но я всегда получаю сообщение об ошибке «ожидание допустимо только в асинхронной функции».:
const fs = require('fs');
const util = require('util');
// Convert `fs.readFile()` into a function that takes the
// same parameters but returns a promise.
const readFile = util.promisify(fs.readFile);
// You can now use `readFile()` with `await`!
const buf = await readFile('../../package.json'); <-- this is where I get the error
const obj = JSON.parse(buf.toString('utf8'));
obj.name; // 'masteringjs.io'
console.log(obj);
Я даже пробовал простые примеры, которые не используют util.promisify, но я не могу получить ни одного примера асинхронного ожидания из Интернета для работы.
Что делает это еще более странным, так это то, что quokka.js могу нормально запустить код без ошибок, это только когда я запускаю узел test.js что я получаю эту ошибку.
Результат Quokka для кода выше:
Я отключил настройку в узле или что-то в этом роде?? Я действительно в замешательстве.
Комментарии:
1. Переместите
await
ключевое слово внутриasync
функции. Вы можете использовать IIFE:(async () => { const buf = await readFile('../../package.json'); const obj = JSON.parse(buf.toString('utf8')); console.log(obj); })()
2. здравствуйте, это: синтаксическая ошибка: ожидание допустимо только в асинхронной функции. Я попробовал ваш пример и объект зарегистрирован как неопределенный
3.Переместите каждый оператор после
await
оператора внутриasync
функции. Сообщение об ошибке говорит вам, что вы не можете использоватьawait
внеasync
функции.4. код, который я вставил выше, работает в quokka.js, который использует узел v14.15.5. но когда я пытаюсь запустить файловый узел test.js, это дает ошибку, которую я вставил ранее.
Ответ №1:
Это работает на меня
const fs = require('fs');
const util = require('util');
// Convert `fs.readFile()` into a function that takes the
// same parameters but returns a promise.
const readFile = util.promisify(fs.readFile);
const readFiles = async (path) =>{
const buf = await readFile(path);
const obj = JSON.parse(buf.toString('utf8'));
// obj.name; // 'masteringjs.io'
console.log(obj);
}
readFiles('./package.json').catch(err => {
console.log(err)
})
Еще один способ, которым вы можете воспользоваться, показан ниже
Наличие асинхронности в качестве самоисполняющейся функции без добавления ключевого слова async к фактической функции
const readFile = util.promisify(fs.readFile);
// You can now use `readFile()` with `await`!
(async(path) => {
const buf = await readFile(path);
const obj = JSON.parse(buf.toString('utf8'));
obj.name; // 'masteringjs.io'
console.log(obj);
})('./package.json')
Комментарии:
1. здравствуйте, извините, но это переписывание приведенного выше кода, который не обеспечивает функциональность приведенного выше кода (сохранение разрешенного обещания в переменной, которую можно использовать в дальнейшем коде).
2. Код, который у вас есть, отличается от того, что есть, если вы посмотрите внимательно. Также упомянутое вами требование определяет решение. Большая часть
util.promisify
используется таким образом и выполняется. Вы не можете выполнять самоисполнение, как у вас есть shwon в вашем коде. Я не мог найти этот способ, я запустил это с разными путями, несколькими вызовами и работой
Ответ №2:
Код был правильным (так как это был не мой код, он был взят из рабочего примера).
Проблема заключалась в том, что узел не поддерживает асинхронность/ожидание верхнего уровня с использованием модулей CommonJS. Установите «тип» в «модуль» в файле package.json, чтобы использовать модули ES6.
Как только используется вышеуказанная настройка, код запускается идеально.