Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 函数在仅调用一次时执行两次_Javascript_Node.js - Fatal编程技术网

Javascript 函数在仅调用一次时执行两次

Javascript 函数在仅调用一次时执行两次,javascript,node.js,Javascript,Node.js,我正在制作一个程序,可以读取嵌套文件夹中文件的内容。现在我只是尝试在控制台中记录文件的内容。但我得到的是两份日志,而不是一份。以下是我到目前为止所做的 const fs = require('fs'); const path = require('path'); const { promisify } = require('util'); const getStats = promisify(fs.stat); const readdir = promisify(fs.readdir); con

我正在制作一个程序,可以读取嵌套文件夹中文件的内容。现在我只是尝试在控制台中记录文件的内容。但我得到的是两份日志,而不是一份。以下是我到目前为止所做的

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
(特别是its),并根据请求采取行动。(无论如何,代码都应该这样做。)


旁注1:您正在将一个
async
函数传递到某个(
createServer
)中,该函数不会对它返回的承诺做任何事情。如果您这样做,那么在函数中本地捕获函数中的任何错误是很重要的,因为(再次)没有其他任何东西可以处理它们。例如:

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:该代码正沦为“”的牺牲品。在适当的范围内声明变量。在松散模式下不声明它们会使它们成为全局性的。(还建议使用严格模式,因此会出现错误。)



(这是我贫血小博客上的一篇帖子)

上面的答案是正确的。 我的方法是通过任何形式的“路由”来解决它。 下面是一个小的基本示例,说明了如何做到这一点

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_routes = async (req, res) => {
    switch(req.url) {
        case '/files':
            handle_files(req, res);
        default:
            console.log('for default page');
    }
}

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' });
    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_routes).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;
}

这使您可以通过转到
localhost:8080/files
url

调用
handle\u files
函数。您是对的,这确实是多个请求的问题,并根据这一点更改代码。这一技巧也非常感谢旁注我将更改代码