gpt4 book ai didi

javascript - 函数在只调用一次时被执行两次

转载 作者:搜寻专家 更新时间:2023-10-31 23:33:47 24 4
gpt4 key购买 nike

我正在制作一个程序来读取嵌套文件夹中的文件内容。现在我只是想在控制台中记录文件的内容。但是我得到了两个日志而不是一个。这是我到目前为止所做的

const fs = require('fs');
const path = require('path');
const { promisify } = require('util');
const getStats = promisify(fs.stat);
const readdir = promisify(fs.readdir);
const http = require('http');

handle_files = async (req, res) => {
let files = await scanDir("logs_of_109");
let result = await read_content(files)
check_file_content(result)
res.writeHead(200, { 'Content-Type': 'text/html' });
// console.log(result)
res.write("Hello");
res.end();
};

check_file_content = (file_data) => {
console.log(file_data[1])
}

async function read_content(files) {
let file_data = []
files.map(file => {
let start_index = file.toString().lastIndexOf('.') + 1
let ext = file.substring(start_index, file.length)
if (ext == 'data') {
file_data.push(fs.readFileSync(file, { encoding: 'utf-8' }))
}
})
return file_data
}

http.createServer(handle_files).listen(8080)

async function scanDir(dir, fileList = []) {
// fetch list of files from the giver directory
let files = await readdir(dir);
// loop through all the files
for (let file of files) {
// join new folder name after the parent folder
// logs_of_109/24
let filePath = path.join(dir, file);
try {
//
let stats = await getStats(filePath);
if (!stats.isDirectory()) {
// add the filepath to the array
fileList.push(filePath);
}
if (stats.isDirectory()) {
await scanDir(filePath, fileList);
}
} catch (err) {
// Drop on the floor..
}
}

return fileList;
}

我希望文件内容只记录一次,但它在我的控制台上记录了两次。为什么会发生这种情况,我该如何阻止这种情况?

最佳答案

您的浏览器正在向您的服务器发出两个请求,很可能一个是针对您在地址栏中输入的 URL,另一个是针对 favicon.ico。 (您可以通过在浏览器上打开开发工具并转到“网络”选项卡来快速判断。)

handleFiles 应该查看 req(特别是它的 url property )并根据所请求的内容采取行动。 (这是代码应该做的无论如何。)


旁注 1:您正在将一个 async 函数传递给某个对象 (createServer),该函数不会对其返回的 promise 执行任何操作。如果你这样做,重要的是在函数内部捕获函数中的任何错误,因为(再次)没有其他东西可以处理它们。例如:

handle_files = async (req, res) => {
try {
let files = await scanDir("logs_of_109");
let result = await read_content(files)
check_file_content(result)
res.writeHead(200, { 'Content-Type': 'text/html' });
// console.log(result)
res.write("Hello");
res.end();
} catch (e) {
// ...handle error here...
}
};

旁注 2:该代码正在成为 The Horror of Implicit Globals 的牺牲品¹.在适当的范围内声明您的变量。在松散模式下不声明它们会使它们成为全局变量。 (也推荐使用严格模式,所以你会得到一个错误。)


¹ (这是我贫血的小博客上的一篇文章)

关于javascript - 函数在只调用一次时被执行两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58233378/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com