【问题标题】:Save html-form data in json format in a .json file using node and express with javascript使用节点将 json 格式的 html-form 数据保存在 .json 文件中,并使用 javascript 表示
【发布时间】:2017-07-21 12:41:28
【问题描述】:

node 和 express 的新手 我正在从 html-form 获取用户输入并尝试将其 追加或推送 到 .json 文件中。 我使用了 jsonfile npm-package,但它不是以 json 数组格式出现的

附加代码-

var express = require('express');
var app = express();

//jade --> ejs -->html 
app.engine('html', require('ejs').renderFile);
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'html');

var jsonfile = require('jsonfile');    
var file = './userdata.json'


    //trying to write via form to json
    app.post('/gettingdata', function(req, res) {
        var user_id = req.body.usrid;
        var token = req.body.usrphone;
        var geo = req.body.usrdata;

        //start writing
        var obj = { name: user_id , phone: token, adress: geo }
        jsonfile.writeFileSync(file, obj, {flag: 'a'});

        //default
        //res.send(user_id + ' ' + token + ' ' + geo);
    }); 

html -

<body>
    <form action="/gettingdata" method="post">
            Name:<input type="text" name="usrid" /><br>
            Phone:<input type="text" name="usrphone" /><br>
            RData:<input type=="text" name="usrdata" /><br>
            <input type="submit" value="Submit" >
    </form>
</body>

json 显示为-

{"name":"name1","phone":"8989898989","adress":"random1"}
{"name":"name1","phone":"767656568","adress":"randomdata1"}
{"name":"name1","phone":"767656568","adress":"randomdata1"}

对象之间没有逗号,也没有方括号。我需要它们能够使解析成为可能,以便稍后我可以从前端动态编辑和删除数据。 建议任何链接,方法或 npm 包这样做。如果问题重复,也分享该链接

【问题讨论】:

  • 嗨,欢迎来到 Stack Overflow!作为旁注,尽量避免*Sync 函数的变体并学习异步模式;它会在你以后的 JavaScript/node 职业生涯中非常好为你服务。
  • Sandeep,我用一些代码添加了一个新答案。

标签: javascript json node.js express push


【解决方案1】:

我将用一些代码扩展 Shil 的答案:

// 1. Read the existing file
fs.readFile(file, (err, data) => {
    if (err && err.code === "ENOENT") {
        // But the file might not yet exist.  If so, just write the object and bail
        return fs.writeFile(file, JSON.stringify([obj]), error => console.error);
    }
    else if (err) {
        // Some other error
        console.error(err);
    }    
    // 2. Otherwise, get its JSON content
    else {
        try {
            const fileData = JSON.parse(data);

            // 3. Append the object you want
            fileData.push(obj);

            //4. Write the file back out
            return fs.writeFile(file, JSON.stringify(fileData), error => console.error)
        } catch(exception) {
            console.error(exception);
        }
    }
});

这只是一个快速的说明性示例:随着文件的增长,它的效率很低,因为它必须每次都读取和写入整个文件。

请注意,这将创建一个包含对象数组的文件,这就是您在 JSON 中创建对象列表的方式。所以你的最终输出将如下所示:

[
  {"name":"name1","phone":"8989898989","adress":"random1"},
  {"name":"name1","phone":"767656568","adress":"randomdata1"},
  {"name":"name1","phone":"767656568","adress":"randomdata1"}
]

【讨论】:

    【解决方案2】:

    似乎你正在使用的图书馆不能做那件事。在这两种方法中,我发现:

     var str = JSON.stringify(obj, options.replacer, spaces) + '\n'
     //not sure if fs.writeFileSync returns anything, but just in case
     return fs.writeFileSync(file, str, options)
    

    它将您刚刚传递给函数的字符串写入文件,因此它不会评估已写入文件的内容。所以每次调用函数时它都会写一个json。它不会继续向现有的 json 添加元素。你应该做一个自定义功能来做到这一点。

    你可以这样做:

    1. 检索文件中已有的内容
    2. 解析成json
    3. 追加要添加的json对象
    4. 将结果字符串化并将其保存到文件中,替换首先写入的内容。

    编辑:

    来源: writeFile / writeFileSync

    【讨论】:

    • 好收获。另一个在节点中“手动”做的相当简单的事情的例子。
    • github.com/jprichardson/node-jsonfile/issues/52 上有一个未解决的错误
    • @msanford 是否意味着没有库可以附加 json 文件
    • @Shil 你的意思是+',\n' 而不是+'\n'+'\n' 中的逗号
    • @Sandeep 我复制了库所有者的代码我没有任何意思。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-03
    • 2016-03-05
    • 2015-10-04
    • 2015-07-26
    • 2022-06-10
    相关资源
    最近更新 更多