【问题标题】:TypeError: fs.createReadStream is not a functionTypeError:fs.​​createReadStream 不是函数
【发布时间】:2020-03-01 03:23:56
【问题描述】:

我更喜欢使用承诺而不是回调,所以我使用了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;
};

我在const attachments = {attachment: fs.createReadStream('kitty.png')}; 车道收到了TypeError: fs.createReadStream is not a function。我该如何解决?

【问题讨论】:

  • 你的节点版本是多少? promises API 是一个相对较晚的添加

标签: javascript node.js promise async-await request


【解决方案1】:

fs.promises 不是fs 的超集。虽然它将fs 上的一些方法替换为具有相同核心名称并返回承诺的方法,但它并没有普通的fs 所具有的所有内容。

createReadStream() 是常规 require('fs') 对象上的方法,而不是 require('fs').promises 上的方法。

这就是为什么建议您这样做:

fs = require('fs').promises;

因为它会误导所有人,包括你自己,认为fs 是核心 nodejs fs 模块。不是。

相反,我会推荐这个:

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

然后,您可以酌情使用fsfsp,包括fs.createReadStream()

是的,这似乎有点不整洁。或许 fs 模块到 Promise 的转换只是部分完成,有一天你可以使用 fs.promises 作为完全替代品——我真的不知道在那个模块上工作的人的意图是什么。目前,您必须同时使用这两个版本才能访问全部功能。


另外,请注意util.promisify(require('request'))。请求函数不使用标准异步回调签名(err, result),因为它将三个参数传递给回调(err, response, body),而不是通常的两个。有一些请求派生模块已经被承诺(request-promiserequest-promise-native)完全可以与承诺一起使用。

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 2020-04-26
    • 2020-02-12
    • 2021-08-26
    • 2021-09-24
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2021-01-10
    相关资源
    最近更新 更多