【发布时间】:2022-01-19 19:48:01
【问题描述】:
我正在尝试构建一个读取和写入一些文件的脚本。这些功能工作正常,但我无法异步读取/写入功能。我遇到的主要问题是我正在尝试编写一个文件,然后我正在尝试导入它。
例如:给定这两个函数,第一个函数写入./myFile.js,第二个函数尝试像这样导入文件:
var fs = require('fs');
const myFile = require('./myFile')
async function writeMyFile() {
return new Promise((resolve, reject) => {
fs.promises.readFile('./myFile.js', 'utf8').then((file) => {
const replacedData = file + 'newLine'
fs.promises
.writeFile('./myFile.js', replacedData)
.then(() => resolve('Writted'))
.catch(() => reject('Error'));
});
});
}
function importMyFile() {
console.log(myFile) // this is always empty
}
await writeMyFile()
importMyFile()
问题是我可以看到myFile 被正确写入,但我在importMyFile 函数中看不到它。当我分别尝试这些功能时,它可以工作(执行第一个,然后执行第二个)
我尝试了以下方法:
- 使用
fs库中的promise函数:fs.promises.readFile()和fs.promises.writeFile()(上例) - 返回一个在
writeMyFile结束时解析的 Promise。 (上例) - 直接在
readMyFile函数中导入文件如下:
function importMyFile() {
const myFile = require('./myFile')
console.log(myFile) // this is always empty
}
- 无需像这样返回新的 Promise:
async function writeMyFile() {
const file = await fs.promises.readFile('./myFile.js', 'utf8')
const replacedData = file + 'newLine'
await fs.promises.writeFile('./myFile.js', replacedData)
}
我还看到在控制台中,日志的顺序是这样的:
'Writted'
{} //empty file
请记住,这是我案例的简化版本。
编辑我尝试写入和导入的文件看起来总是这样:
module.exports = []
它被填充了,它看起来像这样:
const myModule = {
name: 'name',
surname: 'surname'
}
module.exports = [myModule]
我希望有人知道这里发生了什么。谢谢!
【问题讨论】:
-
你不需要异步和承诺。
async为您做出承诺,因此在做出承诺之后等待完成,但在写入完成之前完成 -
我已经尝试过不返回
Promise->await fs.promises.readFile(...)和await fs.promises.writeFile(..)但没有任何变化 -
我也不知道
require会返回任何有用的东西。而且,该文件是否已经存在?为什么要先读再写?如果它不存在,它将不会被写入 -
文件始终存在。我将澄清我的代码示例。
-
require返回module.exports。如果您在 myFile.js 中没有任何导出,它将返回一个空对象。
标签: javascript node.js asynchronous async-await fs