TypeError: fs.createReadStream не является функцией - PullRequest
0 голосов
/ 04 ноября 2019

Я предпочитаю использовать обещания, а не обратные вызовы, поэтому я использовал util.promisify.

`use strict`;

const util = require(`util`),
    request = util.promisify(require(`request`)),
    fs = require(`fs`).promises;

module.exports = async (message, api) => {
    const end = api.sendTypingIndicator(message.threadID);
    const data = await request({ url: `https://api.thecatapi.com/v1/images/search`, followAllRedirects: true });
    const [json] = JSON.parse(data.body);
    console.log(fs);
    const image = await request(json.url);
    await fs.writeFile(`kitty.png`, image.body, `binary`);
    const attachments = {attachment: fs.createReadStream(`kitty.png`)};
    await fs.unlink(`kitty.png`);
    end();
    return attachments;
};

Я получил TypeError: fs.createReadStream is not a function на const attachments = {attachment: fs.createReadStream('kitty.png')}; линии. Как я могу решить это?

1 Ответ

1 голос
/ 04 ноября 2019

fs.promises не является надмножеством fs. Хотя некоторые методы в fs заменяются методами с тем же именем ядра, которые возвращают обещание, на нем нет всего того, что имеет простой fs.

createReadStream() - это метод вобычный require('fs') объект, не включенный require('fs').promises.

Вот почему не рекомендуется делать следующее:

fs = require('fs').promises;

Потому что тогда он вводит всех в заблуждение, включая вас в мысли, что fs является модулем core nodejs fs. Это не так.

Вместо этого я бы порекомендовал следующее:

const util = require('util'),
    request = util.promisify(require('request')),
    fs = require('fs'),
    fsp = fs.promises;

Затем вы можете использовать fs и fsp, в зависимости от ситуации, включая fs.createReadStream().

* 1027. * Да, это выглядит немного неопрятно. Возможно, преобразование модуля fs в обещания завершено только частично, и когда-нибудь вы сможете использовать fs.promises в качестве полной замены - я не знаю, что намерены люди, работающие над этим модулем. На данный момент вы должны использовать обе версии, чтобы получить доступ ко всем функциям.

Также будьте осторожны с util.promisify(require('request')). Функция запроса не использует стандартную сигнатуру асинхронного обратного вызова (err, result), поскольку она передает три аргумента обратному вызову (err, response, body), а не два обычных. Существуют модули производных запросов, которые уже были обещаны (request-promise и request-promise-native) и полностью готовы к использованию с обещаниями.

...