TypeError:fs.​​createReadStream不是函数

我更喜欢使用承诺而不是回调,所以我使用了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')};。我该怎么解决?

haitv223 回答:TypeError:fs.​​createReadStream不是函数

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)已准备好与承诺一起使用。

本文链接:https://www.f2er.com/3164274.html

大家都在问