繁体   English   中英

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

[英]Node.js: How to write input values of a formular into a JSON file when the submit button is pressed?

新:更多具体说明

我正在使用不同类型的不同产品对网站进行编程。 每个产品都有一个带有注释功能的详细信息页面。 产品详细信息站点的路径类似于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对象的“注释”键? 请帮助我,我花了很多时间尝试不同的东西,但是没有任何效果。

注意:此答案是在重写问题之前编写的: 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. 切勿使用名称带有“ Sync”的fs模块方法,否则您的应用将无法处理请求。
  3. 您需要实现对文件访问的锁定和同步,否则您的数据将被破坏-这是最困难也是最重要的部分,这就是人们将数据库用于此类事情的原因。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM