【发布时间】: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 对不起,我没有很好地解释自己。每当我引用“带有完整路径的文件名”时,就是我面临的错误日志。非常感谢该解决方案对我有用,现在我在插入第二个文件时遇到了一些延迟,但会继续尝试。再次非常感谢! :)
-
我已经在下面发布了答案。请将其标记为答案,以便社区知道现在已回答。
-
另外,关于延迟,可能有多种因素导致。通常,当发生大文件上传时,我建议您立即从服务器发送成功响应,说明文件上传在队列中,并可能实施轮询机制来检查上传是否成功。
标签: node.js file node-modules fs