对于每个未发送到后续函数的循环值。这里发生了啥?节点.js

Posted

技术标签:

【中文标题】对于每个未发送到后续函数的循环值。这里发生了啥?节点.js【英文标题】:For each loop value not being sent to subsequent function. What is happening here? Node.js对于每个未发送到后续函数的循环值。这里发生了什么?节点.js 【发布时间】:2021-03-25 11:15:22 【问题描述】:

我已经在这个项目上工作了三天,我几乎可以理解我所做的一切以及为什么一个值会引发错误,但是在这段代码中:

function updateStats()
    const users = readFile('users','txt','UTF-8');
    users.forEach((v) =>     
        console.log(v);
        var user =  v.toString();
        const statFile = readFile(user,'txt','UTF-8');
        readHTTP(v,currentChannel,statFile[0]);
    );

抛出错误:

I am doing my 15 minutes update
610636905440215071
677257430249242655
539899963568553986
525819952708583427
373982165307752460

Error: ENOENT: no such file or directory, open '/Users/codel/OneDrive/Documents/BattlEye/files/.txt'
    at Object.openSync (fs.js:476:3)
    at Object.readFileSync (fs.js:377:35)
    at readFile (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:98:25)
    at C:\Users\codel\OneDrive\Documents\BattlEye\index.js:214:26
    at Array.forEach (<anonymous>)
    at updateStats (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:211:11)
    at Timeout._onTimeout (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:27:3)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7) 
  errno: -4058,
  syscall: 'open',
  code: 'ENOENT',
  path: '/Users/codel/OneDrive/Documents/BattlEye/files/.txt'

C:\Users\codel\OneDrive\Documents\BattlEye\index.js:215
        readHTTP(v,currentChannel,statFile[0]);
                                          ^

TypeError: Cannot read property '0' of undefined
    at C:\Users\codel\OneDrive\Documents\BattlEye\index.js:215:43
    at Array.forEach (<anonymous>)
    at updateStats (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:211:11)
    at Timeout._onTimeout (C:\Users\codel\OneDrive\Documents\BattlEye\index.js:27:3)
    at listOnTimeout (internal/timers.js:554:17)
    at processTimers (internal/timers.js:497:7)

我假设它与函数结构有关,但我的其他 foreach 循环在这种语法中运行得很好。有人可以帮忙调试一下吗?

编辑: 读取文件:

function readFile(fileName,fileType,fileFormat)
    try 
        const data = fs.readFileSync('/Users/codel/OneDrive/Documents/BattlEye/files/'+fileName+'.'+fileType, fileFormat);
        const lines = data.split(/\r?\n/);
        return lines;
     catch (err) 
        console.error(err);
    

读取HTTP:

function readHTTP(user,cc,userID)
    const puppeteer = require('puppeteer');
    var url= 'https://r6.tracker.network/profile/pc/' + userID;
    (async() => 
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        try 
        await page.goto(url);
         catch(error)
            cc.send('You did not enter a valid Ubisoft UserID');
        
        const data = await page.evaluate(() => 
            return Array.from(document.querySelectorAll('.trn-defstat__value'))
                    .map(item => item.innerText);
        ); 
        writeStatFile(user,userID,data);
        console.log("Personal stats file was written");
    )();

前两天刚学了这门语言,但是值并没有通过for each循环传递给后面的函数。

【问题讨论】:

它似乎无法读取文件users,因此您无法在users 上运行forEach()。检查您尝试读取的文件名。 @Ozgur Sar 我添加了带有完整日志的编辑。它读取 users.txt,但在搜索 user.txt 文件时,未发送该值。完整的日志显示 console.log(v) 正在输出我需要的值。 请贴出readFile(也可能是readHTTP)的代码,否则我们无能为力。 使用调试器检查v/user的值是多少。我敢打赌:你的 users.txt 以换行符结尾,最后一个 v 是空字符串。 @Bergi 我认为你是对的。我阅读文件的方式与分割每一行有关。你是对的。这只是一个未被捕获的空白。 【参考方案1】:

错误号:-4058, 系统调用:'打开', 代码:'ENOENT', 路径:'/Users/codel/OneDrive/Documents/BattlEye/files/.txt'

寻找异步问题的一个很好的理由。

试试这个:

const promises = require('fs').promises

const updateStats = async () => 
  try 
    const users = await promises.readFile('users.txt', encoding: 'utf8');
    for (let user of users.split("\n")) 
      const statFile = await promises.readFile(user.toString() + '.txt', encoding: 'utf8');

      if(statFile && statFile[0]) 
        readHTTP(user,currentChannel,statFile[0]);
      
    
   catch(err) 
    console.error(err.toString())
  

不确定这是否可行,因为我没有时间测试它。

真的希望这会有所帮助:)

【讨论】:

【参考方案2】:

几乎可以肯定,users.txt 中有一个空换行符

我会做以下事情:

function updateStats()
    const users = readFile('users','txt','UTF-8');
    users.forEach((v) => 
        if (v === '') return
        console.log(v);
        var user =  v.toString();
        const statFile = readFile(user,'txt','UTF-8');
        readHTTP(v,currentChannel,statFile[0]);
    );


【讨论】:

以上是关于对于每个未发送到后续函数的循环值。这里发生了啥?节点.js的主要内容,如果未能解决你的问题,请参考以下文章

这里的 useRef 内部发生了啥?

C++11 中的“转换构造函数”发生了啥变化? [复制]

这个函数顶部发生了啥

hash_table 初始化,发生了啥? [复制]

发生了啥?一天没问题,第二天“未定义”?

python的〜在使用布尔值时发生了啥?