Node.js:当按下提交按钮时,如何将公式的输入值写入JSON文件?

时间:2017-04-04 16:43:30

标签: javascript jquery html json node.js

新:更具体的描述

我正在使用不同类型的不同产品对网站进行编程。每个产品都有一个带注释功能的详细信息页面。产品详细信息站点的路径类似于http://localhost:3000/details/type/name。当用户填写表单以编写注释并按下提交按钮时,所有数据都应附加到产品类型的JSON文件中,如下所示:

type1.json

[
  {
    "name": "Product1",
    "description": "Description1",
    "comments":[
      {
        "user": "Matthew",
        "message": "Very Good!",
        "timestamp": "2017-03-17T17:51Z"
      },{
        "user": "Lea",
        "message": "Nice",
        "timestamp": "2017-03-10T13:29Z"
      }
    ]
  },
  {
    "name": "Product2",
    "description": "Description2",
    "comments":[
      {
        "user": "Ann",
        "message": "This is very useful!",
        "timestamp": "2017-02-02T19:30Z"
      },{
        "user": "Tim",
        "message": "Awesome",
        "timestamp": "2017-04-01T20:25Z"
      }
    ]
]

这是我的HTML文件的一部分,其中包含以下格式:

details.html

<form action="" method="POST" id="commentForm">
    <div class="form-group">
        <input type="text" id="name"
               placeholder="Name" class="form-control" name="name"/>
    </div>
    <div class="form-group">
        <textarea cols="30" rows="5" class="form-control" id="message" placeholder="Message" name="message"></textarea>
    </div>
    <div class="form-group">
        <div class="col-md-6 text-center">
            <button type="reset" class="btn btn-default">
                <span class="glyphicon glyphicon-remove"></span>
                Reset
            </button>
        </div>
        <div class="col-md-6 text-center">
            <button type="submit" class="btn btn-success">
                <span class="glyphicon glyphicon-ok"></span>
                Send
            </button>
        </div>
    </div>
</form>

这是我的JavaScript文件的相关部分:

details.js

$(function () {
    $.fn.serializeObject = function()
    {
        var o = {};
        var a = this.serializeArray();
        $.each(a, function() {
            if (o[this.name] !== undefined) {
                if (!o[this.name].push) {
                    o[this.name] = [o[this.name]];
                }
                o[this.name].push(this.value || '');
            } else {
                o[this.name] = this.value || '';
            }
        });
        return o;
    };

    $("#commentForm").bind("submit", function(evt) {
        console.log(JSON.stringify($("#commentForm").serializeObject()));
        $.ajax({
            url: window.location.pathname,
            type: "POST",
            contentType: "application/json",
            data: JSON.stringify($("#commentForm").serializeObject()),
            success: function(data) {
                console.log('success');
                console.log(JSON.stringify(data));
            },
        });
        return false;
    });
});

现在,问题是:在app.js中写什么? 以下是当前app.js的摘录。

app.js

const express = require("express");
const app = express();
const fs = require('fs');
const path = require("path");
const jsonfile = require('jsonfile');
const bodyParser = require('body-parser');
app.use(bodyParser.json());

const type1File = __dirname + "/data/type1.json";

...

app.post("/details/:typ/:name", function (req, res) {
    if (req.params.typ == "type1") {
        const apps = readJsonFile(type1File);
        res.send(getProduct(apps, req));
???What to write here???
    }
...
});

function readJsonFile(file) {
    try {
        const data = fs.readFileSync(file);
        return JSON.parse(data);
    } catch (e) {
        console.log(file + "could not be read. " + e);
        return [];
    }
}

我应该添加什么?如何将数据写入正确的JSON对象的&#34;注释&#34; -key?请帮助我,我花了很多时间尝试不同的东西,但没有什么工作正常。

1 个答案:

答案 0 :(得分:1)

注意:这个答案是在重写问题之前写的: https://stackoverflow.com/posts/43213085/revisions

这个问题很笼统,很难给你任何具体的答案。但是如果您想在应用程序中使用持久数据,那么您应该使用数据库。

某些数据库(如Mongo,Postgres或Redis)需要作为独立应用程序在相同或不同的服务器上运行。像SQLite这样的嵌入式数据库不需要独立的流程,可以直接在您的应用程序中运行。数据库有多种选择,您必须根据具体情况自行选择。但是你应该选择一些数据库来存储数据。

并不是说不可能在更新时写入JSON文件然后根据需要读取这些文件,而是为了同步对数据的访问而必须完成的工作量没有两个写入请求同时发生,并且在写入正在进行时没有读取,所有这些都不会意外地阻塞进程中的事件循环并同时处理多个请求,这比仅使用任何数据库要困难得多意图。

像Mongo这样的一些数据库会让你存储任何JSON文档(实际上它存储了BSON,但对于用户来说它就像JSON一样)。使用像Mongo或CouchDB这样的文档数据库与拥有JSON文件最相似,但使用关系数据库也可以正常工作。几乎所有持久数据都保存在数据库中。如果您可以编写自己的数据库来存储JSON文件中的数据,那么无论如何都要这样做,但如果您不能使用正确的工具来完成工作。

话虽如此,如果您仍然坚持阅读和编写JSON文件,请按以下步骤操作:

要将数据作为JSON写入文件,您需要使用JSON.stringify()fs.writeFile()

要从文件中读取JSON数据,您需要使用fs.readFile()JSON.parse()

要记住的事情:

  1. JSON.parse()JSON.stringify()必须始终包含在try / catch块中,否则您的应用会崩溃(或从npm使用tryjson模块)
  2. 永远不要使用fs模块的方法&#34;同步&#34;在他们的名字或其他方面,您的应用将被阻止服务请求。
  3. 您需要实现对文件访问的锁定和同步,否则您的数据将被破坏 - 这是最困难和最重要的部分,这就是人们使用数据库进行此类事情的原因。