Вопрос по node.js, javascript, json – Используя Node.JS, как мне прочитать файл JSON в (серверную) память?

489
Background

Я делаю некоторые эксперименты с Node.js и хотел бы прочитать объект JSON, либо из текстового файла, либо из файла .js (что лучше ??) в память, чтобы я мог быстро получить доступ к этому объекту из кода. Я понимаю, что есть такие вещи, как Монго, Альфред и т. Д., Но это не то, что мне сейчас нужно.

Question

Как мне прочитать объект JSON из текстового или js-файла и в память сервера, используя JavaScript / Node?

как вы называете память сервера? ваш скрипт nodejs будет работать до тех пор, пока вы его работаете, но вам придется где-то хранить данные, если вы не сделаете скрипт nodejs постоянным. mpm

Ваш Ответ

7   ответов
992

var fs = require('fs');
var obj = JSON.parse(fs.readFileSync('file', 'utf8'));

асинхронный:

var fs = require('fs');
var obj;
fs.readFile('file', 'utf8', function (err, data) {
  if (err) throw err;
  obj = JSON.parse(data);
});
Ради полноты. Их существует нпм называетсяjsonfile.
Я думаю, что JSON.parse является синхронным, напрямую из v8, что означает, что даже при использовании Async люди должны быть осторожны с большими файлами JSON. так как это связало бы узел.
два момента: (1) синхронный ответ должен бытьlet imported = require("file.json"), (2) JSON.parse должен быть асинхронным, потому что я использовал этот код для загрузки 70-мегабайтного файла JSON в память как объекта. Это займет миллисекунды таким образом, но если я используюrequire(), Этоchugs.
Я не могу поверить, что было так трудно найти эту простую вещь. Каждый ответ, который я получил от google, делал HTTPRequest или JQuery, или делал это в браузере
Еще один момент: это асинхронно, но это не такstreaming, Для этого вам понадобится библиотека (например, Oboe.js). Разница в том, что асинхронность не будет блокировать ваш поток выполнения, но если вы не будете транслировать свои потоки, вы все равно увидите огромные всплески потребления памяти (например, 450 МБ памяти при обработке файла JSON 70 МБ).
-2

If you are looking for a complete solution for Async loading a JSON file from Relative Path with Error Handling

  // Global variables
  // Request path module for relative path
    const path = require('path')
  // Request File System Module
   var fs = require('fs');


// GET request for the /list_user page..get('/listUsers', function (req, res) {
   console.log("Got a GET request for list of users");

     // Create a relative path URL
    let reqPath = path.join(__dirname, '../mock/users.json');

    //Read JSON from relative path of this file
    fs.readFile(reqPath , 'utf8', function (err, data) {
        //Handle Error
       if(!err) {
         //Handle Success
          console.log("Success"+data);
         // Parse Data to JSON OR
          var jsonObj = JSON.parse(data)
         //Send back as Response
          res.end( data );
        }else {
           //Handle Error
           res.end("Error: "+err )
        }
   });
})

Directory Structure:

enter image description here

54

Throws stone at @mihai

Иначе, вот код, который он использовал с асинхронной версией:

// Declare variables
var fs = require('fs'),
    obj

// Read the file and send to the callback
fs.readFile('path/to/file', handleFile)

// Write the callback function
function handleFile(err, data) {
    if (err) throw err
    obj = JSON.parse(data)
    // You can now play with your datas
}
Отлично :-) Мне не нравятся встроенные обратные вызовы, хотя, это может привести к кошмарам обратного вызова, которых я бы предпочел избежать.
Это по какой-то причине ... если вы не хотите синхронно.
согласился :), также добавил async
336

require и путь к вашему файлу JSON.

Например, предположим, у вас есть следующий файл JSON.

test.json

{
  "firstName": "Joe",
  "lastName": "Smith"
}

Затем вы можете легко загрузить это в ваше приложение node.js, используяrequire

var config = require('./test.json');
console.log(config.firstName + ' ' + config.lastName);
Для меня это не работает :(
Просто, чтобы люди знали, и если я правильно помню,require в узле работает синхронно. Погружение в глубинуhere
Другая проблема / преимущество такого метода заключается в том, что требуемые данные кэшируются, если вы не удалили специально кэшированный экземпляр.
& Quot; требуется & Quot; предназначен для загрузки модулей или конфигурационных файлов, которые вы используете, в течение всего срока службы вашего приложения. не кажется правильным использовать это для загрузки файлов.
@ Рам Это работает для меня, может быть, ваше местоположениеtest.json будет отличаться от его примера. я используюnode 5.0
1

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfile_file_options_callback


fs.readFile('/etc/passwd', (err, data) => {
  if (err) throw err;
  console.log(data);
});  

// options
fs.readFile('/etc/passwd', 'utf8', callback);

https://nodejs.org/dist/latest-v6.x/docs/api/fs.html#fs_fs_readfilesync_file_options

You can find all usage of Node.js at the File System docs!
надеюсь, это поможет вам!

11

util.promisify() асинхронно читать такой файл

const {promisify} = require('util')
const fs = require('fs')
const readFileAsync = promisify(fs.readFile)

readFileAsync(`${__dirname}/my.json`, {encoding: 'utf8'})
  .then(contents => {
    const obj = JSON.parse(contents)
    console.log(obj)
  })
  .catch(error => {
    throw error
  })
Если вы хотите использовать обещания, есть такжеfs/promises с узла 10. Примечание: API является экспериментальным:nodejs.org/api/fs.html#fs_fs_promises_api
.readFile уже является асинхронным, если вы ищете версию синхронизации, ее имя.readFileSync.
26

var json_data = require('/path/to/local/file.json');

и получить доступ ко всем элементам объекта JSON.

@ DavidA.Gray Вопрос хочет иметь возможность доступа к объектам как к объектам, а не как к строкам. Помимо одиночного вопроса Лукас упомянул, что этот ответ в порядке.
Этот подход загружает файл только один раз. Если вы изменитеfile.json после нового запроса (без перезапуска программы) данные будут от первой загрузки. У меня нет источника, чтобы поддержать это, но у меня было это в приложении, которое я строю
Ваш ответ ужасно неполный. То, что это дает вам, является объектом, и он даже не удосуживается реализовать tostring ().

Похожие вопросы