我更喜欢使用promises而不是回调,所以我使用了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')};
lane收到了TypeError: fs.createReadStream is not a function
。我该如何解决这个问题呢?
发布于 2019-11-05 03:22:02
fs.promises
不是fs
的超集。虽然它将fs
上的一些方法替换为返回promise的相同核心名称的方法,但它并不包含普通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
模块到promises的转换只完成了一部分,有一天你可以使用fs.promises
作为一个完全的替代品--我真的不知道在这个模块上工作的人打算做什么。目前,您必须同时使用这两个版本才能访问全部功能。
另外,要小心util.promisify(require('request'))
。请求函数不使用标准的异步回调签名(err, result)
,因为它向回调(err, response, body)
传递了三个参数,而不是通常的两个。有一些请求派生模块已经被简化(request-promise
和request-promise-native
),完全可以与promises一起使用。
https://stackoverflow.com/questions/58699731
复制相似问题