Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS/Node:使用方括号更新JSON文件_Javascript_Json_Node.js - Fatal编程技术网

Javascript JS/Node:使用方括号更新JSON文件

Javascript JS/Node:使用方括号更新JSON文件,javascript,json,node.js,Javascript,Json,Node.js,我的应用程序需要将注册的新用户写入一个JSON文件,以便稍后将此文件发送给用户 我想要的是: [ {"username": "A"}, {"username": "B"}, {"username": "C"} ] 当新用户“D”注册时,NodeJS会将文件更新为: [ {"username": "A"}, {"username": "B"}, {"username": "C"}, {"username": "D"} ] 但是,我在实现这一点时遇到了问题,因为尽管我可以“附加”到

我的应用程序需要将注册的新用户写入一个JSON文件,以便稍后将此文件发送给用户

我想要的是:

[
 {"username": "A"},
 {"username": "B"},
 {"username": "C"}
]
当新用户“D”注册时,NodeJS会将文件更新为:

[
 {"username": "A"},
 {"username": "B"},
 {"username": "C"},
 {"username": "D"}
]
但是,我在实现这一点时遇到了问题,因为尽管我可以“附加”到文件中,但我不能在关闭“]”之前写入用户名

我尝试不使用方括号和JSON.parse(arayFromFileRead),但它给了我一个

'意外标记{'

错误

有人能帮忙吗

  • 写入文件,在最后一行前一行。也就是说,在结束方括号前一行
  • 将文件作为JSON对象读取而不使用方括号

  • 谢谢。

    为了编写正确的JSON(并且能够用
    JSON.parse.parse来解析它),数组中的对象之间需要有逗号

    [
     {"username": "A"},
     {"username": "B"},
     {"username": "C"}
    ]
    

    为了编写正确的JSON(并能够使用
    JSON.parse
    )解析它),需要在数组中的对象之间使用逗号

    [
     {"username": "A"},
     {"username": "B"},
     {"username": "C"}
    ]
    
    签出此示例:

    var fs = require('fs');
    
    function addUser(user, callback) {
        var usersFile = './users.json';
    
        fs.readFile(usersFile, function(err, users) {
          if (err) {
            return (callback)? callback(err) : console.error(err);
          }
    
          users = (users)? JSON.parse(users) : [];
          users.push(user);
          fs.writeFile(usersFile, JSON.stringify(users), function(err, result){
            (callback)? callback(err, result) : console.error(err);
          });
        });
    }
    
    addUser({username: 'D', password: 'blablabla'});
    
    逻辑

    使用一个users.json文件,我们将通过
    json.stringify()
    函数对所有用户数据进行序列化

    要做到这一点,您必须将整个文件读取到变量,解析它,将新记录推送到变量,序列化(stringify)并将其保存回文件

    好处

    这没有好处!当文件变大时,您将浪费更多的内存和CPU来读取、推送、序列化和写回。此外,您的文件在读/写过程中将被锁定



    这样做更好:

    1) 创建用户文件夹

    2) 使您的代码如下所示:

    var fs = require('fs');
    var path = require('path');
    var md5 = require('md5');
    var usersDir = './users';
    
    function addUser(user, callback) {
        var userFile = path.join(usersDir, md5(user.username)+'.json');
    
        fs.writeFile(userFile, JSON.stringify(user), function(err, result){
          (callback)? callback(err, result) : console.error(err);
        });
    }
    
    addUser({username: 'D', password: 'blablabla'});
    
    逻辑:您有一个用户文件夹,您可以通过“每个用户文件”的方式保存用户记录

    好处

    当您有一个文件(users.json)时,您会遇到并行访问同一个文件的问题

    但当文件是分开的时,文件系统本身就充当数据库,其中json文件是行,内容是文档。

    请检查此示例:

    var fs = require('fs');
    
    function addUser(user, callback) {
        var usersFile = './users.json';
    
        fs.readFile(usersFile, function(err, users) {
          if (err) {
            return (callback)? callback(err) : console.error(err);
          }
    
          users = (users)? JSON.parse(users) : [];
          users.push(user);
          fs.writeFile(usersFile, JSON.stringify(users), function(err, result){
            (callback)? callback(err, result) : console.error(err);
          });
        });
    }
    
    addUser({username: 'D', password: 'blablabla'});
    
    逻辑

    使用一个users.json文件,我们将通过
    json.stringify()
    函数对所有用户数据进行序列化

    要做到这一点,您必须将整个文件读取到变量,解析它,将新记录推送到变量,序列化(stringify)并将其保存回文件

    好处

    这没有好处!当文件变大时,您将浪费更多的内存和CPU来读取、推送、序列化和写回。此外,您的文件在读/写过程中将被锁定



    这样做更好:

    1) 创建用户文件夹

    2) 使您的代码如下所示:

    var fs = require('fs');
    var path = require('path');
    var md5 = require('md5');
    var usersDir = './users';
    
    function addUser(user, callback) {
        var userFile = path.join(usersDir, md5(user.username)+'.json');
    
        fs.writeFile(userFile, JSON.stringify(user), function(err, result){
          (callback)? callback(err, result) : console.error(err);
        });
    }
    
    addUser({username: 'D', password: 'blablabla'});
    
    逻辑:您有一个用户文件夹,您可以通过“每个用户文件”的方式保存用户记录

    好处

    当您有一个文件(users.json)时,您会遇到并行访问同一个文件的问题


    但当文件是分开的时,文件系统本身就充当数据库,其中json文件是行,内容是文档。

    检查谢谢。你是对的。但我的问题仍然存在。如果没有方括号,json.parse将无法工作。所以你想在每次新用户注册时都编辑文件吗?听起来效率很低。你认为呢关于拥有多个JSON文件,每个用户一个,然后在发送时解析所有文件以创建一个JSON文件?您好。您认为这会有效吗?因为我希望该文件的访问量超过新注册用户的访问量。如果我为每个用户注册创建一个新文件,那么每次需要l时,我都需要读取并解析所有文件用户名列表。为什么不使用数据库?其他选项(相当不有效):为什么不解析JSON,向数组中添加一个元素,然后将其完全字符串化到文件中?否则,您仍然可以。谢谢。您是对的。但我的问题仍然存在。如果没有方括号,JSON.parse将无法工作。因此,您希望能够在每次新用户注册时编辑该文件?听起来效率低下。您考虑过吗有多个JSON文件,每个用户一个,然后在发送时解析所有文件以创建一个JSON文件?您好。您认为这会有效吗?因为我希望该文件的访问量超过新注册用户的访问量。如果我为每个用户注册创建一个新文件,那么每次需要u列表时,我都需要读取并解析所有文件ser名称。为什么不使用数据库?其他选项(相当低效):为什么不解析JSON,向数组中添加一个元素,然后将其完全字符串化到文件中?否则,您仍然可以。我认为如果您也对您的解决方案进行高级解释,会更有帮助。谢谢num8er。我在Mongo对象中有我的用户数据。我之所以需要这个仅包含用户名的文件,是为了传递给aUTOMPLETE例程。在客户端,用户可以向其他用户发送消息,此列表将用于在浏览器中自动完成用户名。因此,每当新用户注册时,我将创建一个Mongo文档,但同时将新用户名写入此文件。这样,应用程序就可以轻松地为浏览器发送此列表。@FelixKling tha谢谢你的评论。谢谢。我已经在代码示例后做了解释。@madu只需制作一个api并执行请求并只获取用户名。你正在尝试优化“nothing”。对于自动完成来说,没有逻辑可以这样做。即使如此,最好在文件中用逗号分隔用户名:“num8er,madu,felix”只需执行以下操作:usernames=data.split(“,”)不是很灵活吗?(:我想如果你能对你的解决方案给出一个高层次的解释会更有帮助。谢谢你,num8er。我在Mongo对象中有我的用户数据。我之所以需要这个仅包含用户名的文件是为了传递给自动完成例程。在客户端,用户可以发送消息