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

时间:2016-06-13 15:43:44

标签: javascript json node.js

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

我想要的是:

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

当新用户" D"注册,NodeJS将文件更新为:

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

但是我在实施这个问题时遇到了问题,因为虽然我可以追加'对于该文件,我不能在结束之前写一个用户名']'。

我试过没有方括号和JSON.parse(arayFromFileRead),但它给了我一个

  

'意外令牌{'

错误。

有人可以帮忙:

  1. 写入文件,最后一行前一行。也就是说,关闭乡绅之前的那一行。
  2. 将文件作为JSON对象读取,不带方括号。
  3. 谢谢。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

查看此示例:

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'});

逻辑:您拥有用户文件夹,其中您保留用户记录"每个用户的文件"方式

好处

当你有1个文件(users.json)你有并行访问同一个文件的问题。

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