【问题标题】:Export the data from a Mongo DB database in a CSV以 CSV 格式从 Mongodb 数据库中导出数据
【发布时间】:2021-08-17 16:43:41
【问题描述】:

我在 Node JS 中有一个项目,我想通过视图中的按钮 (index.ejs) 将 Mongo DB 中数据库中包含的数据导出到 CSV 文件中。 我正在使用mongoose 连接到数据库并将数据导出到我正在尝试使用json-2-csv 的CSV。

在按钮中,我添加了一个 url,以便能够通过按钮调用该 url,并且 json-2-csv 函数响应该 url,但我不知道该怎么做,或者它是否是最好的方式。

这是我的app.js

const fs = require('fs');
const json2csv = require("json2csv").Parser;
const userModel = require('./models/users');
const express = require("express");
const app = express();

app.get('/export/csv', async (req, res) => {
  await userModel.find((err, data) => {
      if (err) throw err;
      const json2csvParser = new json2csv({ header: true });
      const csvData = json2csvParser.parse(data);
      fs.writeFile("users.csv", csvData, function(error) {
          if (error) throw error;
          console.log("Write to bezkoder_mongodb_fs.csv successfully!");
      });
      
  });
});

这是button

<form action="/export/csv" mehotd="GET">
    <button id="export-csv">Export CSV</button>
</form>

【问题讨论】:

  • 首先,您需要建立一个DB连接,并且需要在DB中有数据。你做的方式很好,所以你在哪里卡住了,你能解释一下吗?
  • @kedarsedai 如果在 app.js 或控制器中,我不知道将函数放在哪里,也不知道如何将连接导入数据库。而且,我想要做的是从按钮调用它,但我也不能这样做,我不知道如何添加到响应该 url 的函数

标签: node.js mongodb mongoose ejs json2csv


【解决方案1】:

您可以在单个文件app.js 文件中实现所有这些功能。我们需要有json2csv 模块,因为这个moduleparser 类,这样我们就可以使用parse() 方法来获取CSV 格式的数据为String。这里lean 选项告诉猫鼬跳过实例化一个完整的Mongoose document,只给你Plain Old JavaScript ObjectPOJO。而且我也使用了usernamepassword 作为documents 所以相应地改变它。

const path = require('path');
const ejs = require('ejs');
const fs = require('fs');
const express = require('express');
//You need to have some documents into your DB first 
const Collection = require('your/Modal Path');
const Json2csvParser = require("json2csv").Parser;
const app = express();
const port = process.env.PORT || 3000;

//Templating Engine Ejs
app.set('view engine', 'ejs');
app.set('views', path.join(__dirname, 'views'));

//Middleware
app.use(express.urlencoded({
    extended: true
}));
app.use(express.json());

//MONGO DB CONNECTION 
const url = 'mongodb://localhost:27017/users';
mongoose.connect(url, {
        useNewUrlParser: true,
        useUnifiedTopology: true
    })
    .then(() => {
        console.log('Successfully Established Connection with MongoDB')
    }).catch(err => {
        console.log('Failed to Establish Connection with MongoDB with Error: ' + err);
        process.exit();
    });

app.get('/export/csv', async (req, res) => {
    await Collection.find({}).lean().exec((err, data) => {
        if (err) throw err;
        const csvFields = ['_id', 'username', 'password']
        console.log(csvFields);
        const json2csvParser = new Json2csvParser({
            csvFields
        });
        const csvData = json2csvParser.parse(data);
        fs.writeFile("bezkoder_mongodb_fs.csv", csvData, function(error) {
            if (error) throw error;
            console.log("Write to bezkoder_mongodb_fs.csv successfully!");
        });
        res.send('File downloaded Successfully')
    });
});

//HOME route
app.get('/', (req, res) => {
    res.render('home.ejs');
});

//listening to the PORT Number 
app.listen(port, console.log(`Server is running at ${port}`));

所以,这就是您的app.js 文件的外观。并在views directory 中创建一个home.ejs 文件,如views/home.ejs。并添加以下代码:

<form action="/export/csv" mehotd="GET">
    <button id="export-csv">Export CSV</button>
</form>

【讨论】:

  • 我有几个问题:在项目的根文件夹下下载了一个csv,但它不包含数据库的数据,它只包含数据类型和字段名称。我遇到的另一个问题是,下载过程没有结束我不知道如何完成它。我已经用当前代码更新了问题。
  • 好的,如果它有效,非常感谢。我现在还有一个问题,是否可以更改目标文件夹,例如,文件已下载到 Downloads 文件夹中并且下载的符号出现在浏览器中?
  • 是的,当然你可以像fs.writeFile("C:/folder/bezkoder_mongodb_fs.csv", csvData, function(err) { ..... 一样更改destination文件夹
  • 好的,谢谢,效果很好。您能否帮助我解决另一个问题,即我已打开“在数据模型中处理 Node JS 中的错误”。我正在尝试在输入表单中显示错误,例如,如果在年龄字段中插入一个字符串,该字符串将显示错误并重新启动表单。我已经搜索过,但在 Node JS 上找不到任何东西,而且我很新。
  • 你的意思是如果用户输入的年龄是需要整数的字符串,那么你需要显示一个错误,比如(年龄应该是数字)?
猜你喜欢
  • 1970-01-01
  • 2018-12-24
  • 2013-11-20
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 2018-08-08
  • 1970-01-01
  • 2011-01-07
相关资源
最近更新 更多