NodeJs - 使用 fs.createReadStream 读取文件时出错

Posted

技术标签:

【中文标题】NodeJs - 使用 fs.createReadStream 读取文件时出错【英文标题】:NodeJs - Error while reading files using fs.createReadStream 【发布时间】:2021-10-14 03:56:42 【问题描述】:

我正在尝试为我的网络应用程序实现一项功能,您可以在其中上传 CSV 文件并将数据插入 Postgresql。我已经制作了我的应用端点并编写了一些代码


    const router = require('express').Router()
    const uploadMid = require('./fileUpMid')
    const pool = require('./db')
    
    
    const fs = require("fs");
    const fastcsv = require("fast-csv");
    
    const upload = async (req, res) => 
        if (req.files === null) 
            return res.status(400).json( msg: 'No file uploaded' );
        
    
        const file = req.files.file;
    
        file.mv(`$__dirname/uploads/$file.name`, err => 
            if (err) 
                console.error(err);
                return res.status(500).send(err);
            
            res.json( fileName: file.name, filePath: `/uploads/$file.name` );
        );
    
        let persons = [];
        let path = __dirname + "/uploads/" +file.name;
    
        fs.createReadStream(path)
            .pipe(fastcsv.parse( headers: true ))
            .on("error", (error) => 
                console.error(error.message);
            )
            .on("data", (row) => 
                persons.push(row);   
            )
            .on("end", () => 
                //remove head
                persons.shift();
    
                const q = "some query here";
    
                pool.connect((err, client, done) => 
                    if (err) throw err;
                    
    
                    try 
                        persons.forEach(row => 
                            console.log(typeof row)
                            var obj = JSON.parse(JSON.stringify(row));
                            var values = Object.keys(obj).map(function (key)  return obj[key]; );
                            console.log(values)
                            client.query(q, values, (err, res) => 
    
                                if (err) 
                                    console.log(err.stack);
                                 else 
                                    console.log("inserted " + res.rowCount + " row:", row);
                                
                            );
                        );
                     finally 
                        done();
                    
                );
            )
        // fs.unlinkSync(path)
            
    
    
    
    router.post('/file', uploadMid.single("file") ,upload)
    
    module.exports = router

一切似乎都很好,但是当我尝试上传第二个文件时,我总是在终端上收到错误

错误:ENOENT:没有这样的文件或目录,请在此处打开“带有完整路径的文件名”

>- Emitted 'error' event on ReadStream instance at: 
>- at internal/fs/streams.js:126:14
>- at FSReqCallback.oncomplete (fs.js:180:23) 
>- errno: -4058,
>- code: 'ENOENT',
>- syscall: 'open',
>- path: 'filename here with full path'

我知道这不是一种安全可靠的数据上传方式,但这个应用程序只能在本地运行。即使第一个文件在 DevTools 控制台中成功上传,它也会记录

GET http://localhost:3000/uploads/filename [HTTP/1.1 404 Not Found 8ms]

但文件是在上传目录中创建的,其所有内容。 关于寻找什么的任何提示?

提前谢谢你:)

【问题讨论】:

此处出现错误(“此处带有完整路径的文件名”)我从来没有在不使用path.join 的情况下定义fs 函数的绝对路径。可以试试path.join(__dirname, 'uploads', file.name);吗? @ypahalajani 对不起,我没有很好地解释自己。每当我引用“带有完整路径的文件名”时,就是我面临的错误日志。非常感谢该解决方案对我有用,现在我在插入第二个文件时遇到了一些延迟,但会继续尝试。再次非常感谢! :) 我已经在下面发布了答案。请将其标记为答案,以便社区知道现在已回答。 另外,关于延迟,可能有多种因素导致。通常,当发生大文件上传时,我建议您立即从服务器发送成功响应,说明文件上传在队列中,并可能实施轮询机制来检查上传是否成功。 【参考方案1】:

根据错误判断(错误:ENOENT:没有这样的文件或目录,打开“带有完整路径的文件名”),这是使用 @987654321 在 NodeJS 应用程序中定义路径的建议方法@模块。

const path = require('path');

// Inside`upload` middleware
const filePath = path.join(__dirname, 'uploads', file.name);

【讨论】:

以上是关于NodeJs - 使用 fs.createReadStream 读取文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

Nodejs项目手记Nodejs中使用图片验证码,captchapng模块可以解决Nodejs图片验证码

nodejs使用jimp实现图片处理

如何使用nodejs快速搭建本地服务器

nodejs使用技巧

使用nodejs处理Excel文件

如何使用nodejs做爬虫程序