3 回答

TA貢獻(xiàn)1859條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是我解決它的方法。問題在于底層 MongoDB 連接本身。流沒有錯(cuò)。從文件中讀取記錄后,將它們插入數(shù)據(jù)庫,并在讀取并插入所有文件中的所有記錄后,關(guān)閉底層連接以結(jié)束程序。
const getRecordsFromFile = fileName => {
return new Promise((resolve, reject) => {
const rows = [];
fs.createReadStream(fileName)
.pipe(csv({ skipLines: 7, mapHeaders: ({ header, index }) => _.camelCase(header) }))
.on("data", row => rows.push(row))
.on("end", () => resolve(rows));
});
};
const main = async () => {
const files = fs.readdirSync(dataPath);
for (let i = 0; i < files.length; i++) {
const records = await getRecordsFromFile(`${dataPath}/${files[i]}`);
await loadRecordsToDB(getSysInfo(files[i]), records);
}
mongoose.connection.close();
};
main();

TA貢獻(xiàn)2019條經(jīng)驗(yàn) 獲得超9個(gè)贊
對(duì)于 CLI,您必須使用 db.close() 關(guān)閉 mongodb 連接/您可以關(guān)閉。
句法:
// any other clean ups
mongoose.connection.close(function () {
console.log('Mongoose connection disconnected');
});
重構(gòu)代碼:
const util = require("util");
const readDir = util.promisify(fs.readdir);
const readCSV = () => {
return new Promise((res, rej) => {
let records = [];
fs.createReadStream(filePath)
.pipe(
csv({
skipLines: 7,
mapHeaders: ({ header, index }) => _.camelCase(header)
})
)
.on("data", data => {
records.push(data);
})
.on("error", error => {
rej(data);
})
.on("end", () => {
res(records);
});
});
};
const main = async () => {
try {
const files = await readDir(dataPath);
await Promise.all(
files.map(file => {
return readCSV(`${dataPath}/${file}`) // read csv
.then(csv => saveToDB(getSysInfo(file), csv)); // save in db
})
);
} catch (error) {
console.error(error);
} finally {
db.close(); // close mongo db
}
};
main();

TA貢獻(xiàn)1869條經(jīng)驗(yàn) 獲得超4個(gè)贊
這是對(duì)您的答案的增強(qiáng),它為 readStream 和兩個(gè)await操作添加了錯(cuò)誤處理,因此如果有任何錯(cuò)誤,您的程序仍然可以以受控方式結(jié)束并正確關(guān)閉數(shù)據(jù)庫:
const getRecordsFromFile = fileName => {
return new Promise((resolve, reject) => {
const rows = [];
fs.createReadStream(fileName)
.pipe(csv({ skipLines: 7, mapHeaders: ({ header, index }) => _.camelCase(header) }))
.on("data", row => rows.push(row))
.on("end", () => resolve(rows));
.on("error", reject); // <==
});
};
const main = async () => {
const files = fs.readdirSync(dataPath);
try {
for (let i = 0; i < files.length; i++) {
const records = await getRecordsFromFile(`${dataPath}/${files[i]}`);
await loadRecordsToDB(getSysInfo(files[i]), records);
}
} catch(e) { // <==
console.log(e); // <==
} finally { // <==
// make sure we always close the connection
mongoose.connection.close();
}
};
main();
添加回答
舉報(bào)