我更喜欢使用承诺而不是回调,所以我使用了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')};
。我该怎么解决?
答案 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;
然后,您可以同时使用fs
和fsp
,包括fs.createReadStream()
。
是的,这似乎有点不整洁。也许fs
模块到promise的转换只是部分完成,有一天您可以使用fs.promises
作为完整的替代品-我真的不知道从事该模块工作的人们打算做什么。目前,您必须同时使用这两个版本才能使用全部功能。
此外,请注意util.promisify(require('request'))
。 request函数不使用标准的异步回调签名(err, result)
,因为它将三个参数传递给了回调(err, response, body)
,而不是通常的两个。有已请求的请求派生模块(request-promise
和request-promise-native
)已准备好与承诺一起使用。