TypeError:fs.​​createReadStream不是函数

时间:2019-11-04 19:14:46

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

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

答案 0 :(得分: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'))。 request函数不使用标准的异步回调签名(err, result),因为它将三个参数传递给了回调(err, response, body),而不是通常的两个。有已请求的请求派生模块(request-promiserequest-promise-native)已准备好与承诺一起使用。