【问题标题】:Convert form data to JSON file with NodeJS使用 NodeJS 将表单数据转换为 JSON 文件
【发布时间】:2021-08-13 16:37:17
【问题描述】:

我在Node JS 有一个项目,其中我有一个form 来添加新用户。

如何查看JSON 格式的这些信息?

这些是我看到的数据:

name   age   country   city
------------------------------
user1   22    Spain    Madrid      button{View JSON}

当我按下“查看 JSON”按钮时,表格下方必须显示以下内容:

[
   "id": 1,
   "name": "user1",
   "age": 22,
   "country": "Spain" {
      "city":"Madrid"
   }
]

我的问题:如何创建一个执行此转换的函数?如何从index.ejs调用函数?

【问题讨论】:

    标签: javascript html node.js json


    【解决方案1】:

    我清除并合并了代码。我创建了一个新端点 /export 以将数据导出为 CSV 文件。我无法测试它,所以如果它不起作用,请告诉我。

    const express = require('express');
    const bodyParser = require('body-parser');
    const app = express();
    const MongoClient = require('mongodb').MongoClient;
    
    app.use(bodyParser.urlencoded({ extended: true }));
    app.use(bodyParser.json());
    app.use(express.static('public'));
    app.set('views', './src/views');
    
    app.get('/', async (req, res) => {
    
        const db = await mongoDB();
    
        const person = await db.collection('person').find().toArray();
    
        res.render('index.ejs', { person: person })
    })
    
    app.get('/export', async (req, res) => {
    
        await convertCSV();
    
        res.status(200).send( { success: 1 });
    })
    
    app.post('/person', async (req, res) => {
    
        res.redirect('/');
    })
    
    app.listen(process.env.PORT, function () {
        console.log(`server: http://${process.env.HOST}:${process.env.PORT}`);
    })
    
    
    const mongoDB = () => {
        return new Promise((resolve, reject) => {
            const url = 'mongodb://127.0.0.1:27017';
            MongoClient.connect(url, { useUnifiedTopology: true })
                .then(client => {
                    const db = client.db('users')
                    resolve(db);
    
    
                })
                .catch(error => reject(error))
        });
    }
    
    
    const convertCSV = () => {
        return new Promise((resolve, reject) => {
            const converter = require("json-2-csv");
            const fetch = require("node-fetch");
            const fs = require("fs");
            const flatten = require('flat');
        
            const maxRecords = 10;
        
            const getJson = async () => {
                const response = await fetch(`http://${process.env.HOST}:${process.env.PORT}/users.json`);
                const responseJson = await response.json();
                return responseJson;
            };
        
            const convertToCSV = async () => {
                const json = await getJson();
                let keys = Object.keys(flatten(json[0]));
                let options = {
                    keys: keys
                };
                converter.json2csv(json, json2csvCallback, options);
            };
        
            let json2csvCallback = function (err, csv) {
                if (err) throw err;
                const headers = csv.split('\n').slice(0, 1);
                const records = csv.split('\n').slice(0,);
                for (let i = 1; i < records.length; i = i + maxRecords) {
                    let dataOut = headers.concat(records.slice(i, i + 3)).join('\n');
                    let id = Math.floor(i / maxRecords) + 1;
                    fs.writeFileSync('data' + id + '.csv', dataOut)
                }
            };
        
            await convertToCSV();
            resolve();
        })
    }
    
    

    但是,在同一个文件中使用控制器、索引和路由根本不是一个好习惯。更好的方法是创建路由、控制器文件夹并以更有序的形式放置代码。

    这样的(你可以找到更好的,当然我的只是建议):

     - index.js
     - router.js (A router to manage your endpoints)
     - controllers (Controller when you call the endpoint)
      -> export.controller.js
      -> person.controller.js
     - routes (Endpoints)
      -> export.route.js
      -> person.route.js
     - helpers
      -> databaseHandler.js (Database connection handler)
    

    【讨论】:

    • 我一直在修改文件夹结构,按照您单独说的保留它。另一方面,导出CSV按钮对我不起作用,我在html中调用了convertCSV()函数但无法进入
    • 而且html不读取变量,我在index里加了一个函数:function test() { console.log('view JSON'); },在html里加了一个函数:&lt;button id="viewJson" onclick="test()"&gt;View JSON&lt;/button&gt;,但是进不去
    • 对不起。我不太了解 HTML-nodejs 通信。但是,有趣的是,您添加的 javascript 不起作用。您确定您正确导入了 javascript 文件吗?
    • 我已将问题更新为按部分进行,因为我无法执行完整的代码
    猜你喜欢
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2021-11-19
    相关资源
    最近更新 更多