首页 > 解决方案 > 我在“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: E​​rror: 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`, "");
      }

标签: javascriptnode.jsjsondiscord.js

解决方案


听起来您正在使用原始回调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任何地方的声明。如果您没有,请务必申报。


推荐阅读