对于每个未发送到后续函数的循环值。这里发生了啥?节点.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的主要内容,如果未能解决你的问题,请参考以下文章