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 读取文件时出错的主要内容,如果未能解决你的问题,请参考以下文章