Mongoose 从 csv 导入数据只插入部分数据
Mongoose import data from csv only inserting partial data
我是 MongoDB 和 Node.js 的新手,我在通过 mongoose 从 .csv 文件将数据保存到 MongoDB Atlas 时遇到问题。
我希望用户通过文件输入上传.csv 文件,然后将此.csv 中的数据插入MongoDB Atlas。为此,我使用 'csvtojson' 模块首先将 .csv 文件转换为 JSON 格式。但是在 7 行数据中,只有 4 行被保存在 MongoDB Atlas 上。另外,我收到以下错误:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:561:11)
at ServerResponse.header (D:\Projects\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (D:\Projects\node_modules\express\lib\response.js:170:12)
at done (D:\Projects\node_modules\express\lib\response.js:1008:10)
at tryHandleCache (D:\Projects\node_modules\ejs\lib\ejs.js:278:5)
at View.exports.renderFile [as engine] (D:\Projects\node_modules\ejs\lib\ejs.js:489:10)
at View.render (D:\Projects\node_modules\express\lib\view.js:135:8)
at tryRender (D:\Projects\node_modules\express\lib\application.js:640:10)
at Function.render (D:\Projects\node_modules\express\lib\application.js:592:3)
at ServerResponse.render (D:\Projects\node_modules\express\lib\response.js:1012:7)
at D:\Projects\temp\file.js:57:21
at D:\Projects\node_modules\mongoose\lib\model.js:5068:18
at processTicksAndRejections (internal/process/task_queues.js:77:11)
events.js:352
throw er; // Unhandled 'error' event
^
TypeError: req.next is not a function
at done (D:\Projects\node_modules\express\lib\response.js:1007:25)
at tryRender (D:\Projects\node_modules\express\lib\application.js:642:5)
at Function.render (D:\Projects\node_modules\express\lib\application.js:592:3)
at ServerResponse.render (D:\Projects\node_modules\express\lib\response.js:1012:7)
at D:\Projects\temp\file.js:57:21
at D:\Projects\node_modules\mongoose\lib\model.js:5068:18
at processTicksAndRejections (internal/process/task_queues.js:77:11)
Emitted 'error' event on Function instance at:
at D:\Projects\node_modules\mongoose\lib\model.js:5070:15
at processTicksAndRejections (internal/process/task_queues.js:77:11)
代码如下:
const csvtojson = require("csvtojson");
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const Student = require("./models/student");
const encrypt = require("mongoose-encryption")
//const fs = require("fs");
const app = express();
app.use(express.static("public"));
app.set("views", "./views");
app.set("view engine", "ejs");
app.use(
bodyParser.urlencoded({
extended: true,
})
);
try {
mongoose.connect(
process.env.URL,
{ useNewUrlParser: true, useUnifiedTopology: true },
() => console.log("Mongoose connected")
);
} catch (e) {
console.log("Failed to connect to mongoose!");
}
app.get("/test", function (req, res) {
res.render("test");
});
app.post("/test", async function (req, res) {
const csvfilepath = await req.body.file;
await csvtojson().fromFile(csvfilepath).then((json) => {
var i;
for (i = 0; i < json.length; i++) {
console.log(json[i].fname) //console.log prints all the entries
const newStudent = new Student({
fname: json[i].fname,
lname: json[i].nlame,
prn: json[i].prn,
username: json[i].email,
password: json[i].password,
department: json[i].department,
year: json[i].year,
batch: json[i].batch,
placement_Status: json[i].placement_Status
})
newStudent.save(function(err){
if(err){
console.log(err);
}else{
res.render("test")
}
})
}
});
});
app.listen(3000, function () {
console.log("Server started on port 3000...");
});
Here's the snap of the csv file
MongoDB Atlas
如果有人建议我修复或替代此代码,我将不胜感激。
提前致谢!
错误出在这个特定代码块的 else 语句中:
newStudent.save(function(err){
if(err){
console.log(err);
}else{
res.render("test")
}
用以下代码替换上面的代码修复了代码。而redirect/render函数可以写在for循环之外。
newStudent.save(function(err){
if(err){
console.log(err);
}else{
console.log(success);
}
我是 MongoDB 和 Node.js 的新手,我在通过 mongoose 从 .csv 文件将数据保存到 MongoDB Atlas 时遇到问题。
我希望用户通过文件输入上传.csv 文件,然后将此.csv 中的数据插入MongoDB Atlas。为此,我使用 'csvtojson' 模块首先将 .csv 文件转换为 JSON 格式。但是在 7 行数据中,只有 4 行被保存在 MongoDB Atlas 上。另外,我收到以下错误:
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
at ServerResponse.setHeader (_http_outgoing.js:561:11)
at ServerResponse.header (D:\Projects\node_modules\express\lib\response.js:771:10)
at ServerResponse.send (D:\Projects\node_modules\express\lib\response.js:170:12)
at done (D:\Projects\node_modules\express\lib\response.js:1008:10)
at tryHandleCache (D:\Projects\node_modules\ejs\lib\ejs.js:278:5)
at View.exports.renderFile [as engine] (D:\Projects\node_modules\ejs\lib\ejs.js:489:10)
at View.render (D:\Projects\node_modules\express\lib\view.js:135:8)
at tryRender (D:\Projects\node_modules\express\lib\application.js:640:10)
at Function.render (D:\Projects\node_modules\express\lib\application.js:592:3)
at ServerResponse.render (D:\Projects\node_modules\express\lib\response.js:1012:7)
at D:\Projects\temp\file.js:57:21
at D:\Projects\node_modules\mongoose\lib\model.js:5068:18
at processTicksAndRejections (internal/process/task_queues.js:77:11)
events.js:352
throw er; // Unhandled 'error' event
^
TypeError: req.next is not a function
at done (D:\Projects\node_modules\express\lib\response.js:1007:25)
at tryRender (D:\Projects\node_modules\express\lib\application.js:642:5)
at Function.render (D:\Projects\node_modules\express\lib\application.js:592:3)
at ServerResponse.render (D:\Projects\node_modules\express\lib\response.js:1012:7)
at D:\Projects\temp\file.js:57:21
at D:\Projects\node_modules\mongoose\lib\model.js:5068:18
at processTicksAndRejections (internal/process/task_queues.js:77:11)
Emitted 'error' event on Function instance at:
at D:\Projects\node_modules\mongoose\lib\model.js:5070:15
at processTicksAndRejections (internal/process/task_queues.js:77:11)
代码如下:
const csvtojson = require("csvtojson");
const express = require("express");
const bodyParser = require("body-parser");
const ejs = require("ejs");
const mongoose = require("mongoose");
const Student = require("./models/student");
const encrypt = require("mongoose-encryption")
//const fs = require("fs");
const app = express();
app.use(express.static("public"));
app.set("views", "./views");
app.set("view engine", "ejs");
app.use(
bodyParser.urlencoded({
extended: true,
})
);
try {
mongoose.connect(
process.env.URL,
{ useNewUrlParser: true, useUnifiedTopology: true },
() => console.log("Mongoose connected")
);
} catch (e) {
console.log("Failed to connect to mongoose!");
}
app.get("/test", function (req, res) {
res.render("test");
});
app.post("/test", async function (req, res) {
const csvfilepath = await req.body.file;
await csvtojson().fromFile(csvfilepath).then((json) => {
var i;
for (i = 0; i < json.length; i++) {
console.log(json[i].fname) //console.log prints all the entries
const newStudent = new Student({
fname: json[i].fname,
lname: json[i].nlame,
prn: json[i].prn,
username: json[i].email,
password: json[i].password,
department: json[i].department,
year: json[i].year,
batch: json[i].batch,
placement_Status: json[i].placement_Status
})
newStudent.save(function(err){
if(err){
console.log(err);
}else{
res.render("test")
}
})
}
});
});
app.listen(3000, function () {
console.log("Server started on port 3000...");
});
Here's the snap of the csv file
MongoDB Atlas
如果有人建议我修复或替代此代码,我将不胜感激。
提前致谢!
错误出在这个特定代码块的 else 语句中:
newStudent.save(function(err){
if(err){
console.log(err);
}else{
res.render("test")
}
用以下代码替换上面的代码修复了代码。而redirect/render函数可以写在for循环之外。
newStudent.save(function(err){
if(err){
console.log(err);
}else{
console.log(success);
}