2014-09-14 3 views
0

нормально У меня есть этот JSon файл:чтение и запись файла JSON в node.js

{ 
    "joe": { 
     "name": "joe", 
     "lastName": "black" 
    }, 

    "matt": { 
     "name": "matt", 
     "lastName": "damon" 
    } 
} 

и я хочу, чтобы добавить человека с Node.js:

{ 
    "joe": { 
     "name": "joe", 
     "lastName": "black" 
    }, 

    "matt": { 
     "name": "matt", 
     "lastName": "damon" 
    }, 

    "brad": { 
     "name": "brad", 
     "lastName": "pitt" 
    } 
} 

С ниже кода Я пытаюсь прочитать json-документ, проанализировать его, добавить человека, а затем снова записать в файл. Однако анализируемый объект (jsonObj) не распознается в функции записи. Я знаю, что это связано с циклом событий, но я не уверен, как его решить. Я попытался использовать process.nextTick, но не могу заставить его работать.

var jsonObj; 

fs.open('files/users.json', 'r+', function opened(err, fd) { 
    if (err) { 
     throw err; 
    } 
    var readBuffer = new Buffer(1024), 
     bufferOffset = 0, 
     readLength = readBuffer.length, 
     startRead = 0; 
    fs.read(fd, readBuffer, bufferOffset, readLength, startRead, function read(err, readBytes) { 
     if (err) { 
      throw err; 
     } 
     if (readBytes > 0) { 
      jsonObj = JSON.parse(readBuffer.slice(0, readBytes).toString()); 
      jsonObj["brad"] = {}; 
      jsonObj["brad"].name = "brad"; 
      jsonObj["brad"].lastName = "pitt"; 
     **//Until here it works fine and the 'jsonObj' is properly updated** 
     } 
    }); 
}); 

process.nextTick(function() { 
    var writeBuffer, 
     startWrite = 0, 
     bufferPosition = 0, 
     writeLength; 
    fs.open('files/users.json', 'r+', function opened(err, fd) { 
     if (err) { 
      throw err; 
     } 
     ***//Below I get the 'jsonObj is undefined' error*** 
     writeBuffer = new Buffer(JSON.stringify(jsonObj.toString(), null, '/\t/')); 
     writeLength = writeBuffer.length; 
     fs.write(fd, writeBuffer, bufferPosition, writeLength, startWrite, function wrote(err, written) { 
      if (err) { 
       throw err; 
      } 
     }); 
    }); 
}); 

ответ

6

В узле вы можете require JSON файлы:

var fs = require('fs'); 
var users = require('./names'); 

users.brad = { 
    name: 'brad', 
    lastName: 'pitt' 
} 

var string = JSON.stringify(users,null,'\t'); 

fs.writeFile('./names.json',string,function(err) { 
    if(err) return console.error(err); 
    console.log('done'); 
}) 

Дополнительной асинхронной версия без необходимости:

var fs = require('fs'); 

fs.readFile('./names.json',{encoding: 'utf8'},function(err,data) { 
    var users = JSON.parse(data); 
    users.brad2 = { name: 'brad', lastName: 'pitt' }; 
    var string = JSON.stringify(users,null,'\t'); 

    fs.writeFile('./names.json',string,function(err) { 
    if(err) return console.error(err); 
    console.log('done'); 
    }) 
}) 
2

Простая подсказка: если вам нужно использовать process.nextTick, что-то не так. Оставьте эту функцию библиотечным программистам! :)

Просто переместите функцию вы вызываете с nextTick к Until here...

nextTick не ждать, пока вы читаете этот файл (который может занять несколько hundret клещей!), Он просто ждет следующего тика. И это доступно наносекундой, которую вы называете fs.read, потому что после fs.read основной цикл nodejs простаивает до тех пор, пока ядро ​​не вернет некоторую информацию об этом файле, или кто-то скажет nodejs, что делать с следующим тиком.

+0

также более полезный ответ будет SetTimeout, который работает очень хорошо – Mcs

+0

Лолы ... нет не используйте setTimeout либо – david

+0

, почему нет, если я иду setTimeOut (theWriteFunction, 100), после функции чтения он работает – Mcs

Смежные вопросы