javascript - 我在“for”循环中遇到文件读/写问题
问题描述
每当执行脚本时,我都会尝试设置一个包含不同文件的文件夹。如果文件夹已存在,则无法执行脚本。
当我执行脚本时,会调用一个异步函数,并且该函数的一部分会导致问题......
这是我的代码:
// I want to setup a sub folder with 6 json files
for(i = 1; i < 7; i++) { // I repeat the operation 6 times
await fs.mkdir(`./data/${member.id}/team/${i}.json`, (err) => console.log(err)); // I create the file
let teamMember = new jsoning(`./data/${member.id}/team/${i}.json`); // I initiate the file with jsoning
// and then I write things inside
teamMember.set(`pokemon`, "");
teamMember.set(`nickname`, "");
teamMember.set(`shiny`, "");
teamMember.set(`hasMultipleForms`, "");
teamMember.set(`formList`, "");
teamMember.set(`form`, "");
teamMember.set(`ability`, "");
teamMember.set(`baseStats`, "");
teamMember.set(`currentStats`, "");
teamMember.set(`evs`, "");
teamMember.set(`ivs`, "");
teamMember.set(`moves`, "");
teamMember.set(`movesPP`, "");
teamMember.set(`heldItem`, "");
teamMember.set(`currentHps`, "");
teamMember.set(`statusEffect`, "");
}
但它返回一个错误:
(node:16144) UnhandledPromiseRejectionWarning: Error: ENOENT: no such file or directory, open 'C:\Users\Vincent\Documents\PokéBot\data\533791662628143106\team\1.json' at Object.openSync (fs.js:498 :3) 在 Object.writeFileSync (fs.js:1524:35) 错误号:-4058,代码:'ENOENT',系统调用:'mkdir',路径:'C:\Users\Vincent\Documents\PokéBot\data\533791662628143106 \团队\1.json'
await
我之前尝试删除,mkdir
但没有成功。我还尝试将整个 jsoning 部分放在 mkdir 回调中,首先作为普通函数,然后使用异步。
当我得到:无法读取未定义的“then”.then
后尝试添加时,加上错误:ENOENT ...mkdir
PS:jsoning 是一个编辑 json 文件的库,这里是他们的网站和文档:https ://jsoning.js.org/
该teamMember.set
部分之前使用 await 效果更好,但我尝试过并且它不会更改错误消息。
请帮助我,这个错误来自哪里?
编辑:我想用 mkdir 生成 json 文件,但这不是要做的事情。这是工作代码:
const { mkdir } = require("fs/promises");
await mkdir(`./data/${member.id}/team`, (err)=> console.log(err));
// User team
for(let i = 1; i < 7; i++) {
let teamMember = new jsoning(`./data/${member.id}/team/${i}.json`);
await teamMember.set(`pokemon`, "");
await teamMember.set(`nickname`, "");
await teamMember.set(`shiny`, "");
await teamMember.set(`hasMultipleForms`, "");
await teamMember.set(`formList`, "");
await teamMember.set(`form`, "");
await teamMember.set(`ability`, "");
await teamMember.set(`baseStats`, "");
await teamMember.set(`currentStats`, "");
await teamMember.set(`evs`, "");
await teamMember.set(`ivs`, "");
await teamMember.set(`moves`, "");
await teamMember.set(`movesPP`, "");
await teamMember.set(`heldItem`, "");
await teamMember.set(`currentHps`, "");
await teamMember.set(`statusEffect`, "");
}
解决方案
听起来您正在使用原始回调fs
模块(“无法调用then
使undefined
这一点相当清楚)。因此您的代码正在继续并尝试使用创建它之前 mkdir
的目录,因为您没有使用mkdir
回调。
如果您想使用 Promise,请使用此处描述fsPromises
的模块:
ESM:
import * as fs from "fs/promises";
CJS:
const fs = require("fs/promises");
然后await
将暂停循环,直到工作完成。
如果您使用的是mkdir
,您也可以只导入:
ESM:
import { mkdir } from "fs/promises";
CJS:
const { mkdir } = require("fs/promises");
然后使用mkdir
而不是fs.mkdir
.
旁注:我没有看到i
任何地方的声明。如果您没有,请务必申报。
推荐阅读
- wordpress - 我的网站图标显示在我的浏览器中,但不在谷歌上
- lua - 在nui回调menu_submit期间出错:citizen:/scripting/lua/scheduler.lua:378:
- flutter - 使用 Bloc 处理具有多个身份验证状态的导航路由的最佳方法是什么?
- php - 如何使用苹果验证 ID 令牌签名作为谷歌 oauth2 的替代品
- reactjs - 使用 Context API + UseReducer 同步状态更新
- javascript - react redux 中的传播状态
- sql - 'Unpivoting' 一个 SQL 表
- visual-studio-code - 在 VSCode 中切换/禁用实时 Markdown 预览更新?
- javascript - 标准化 javascript 对象数组中的键
- firebase - 所有 Firebase 云消息都带有 messageId 吗?