489

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

Background

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

Question

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

  • Этот подход загружает файл только один раз. Если вы изменитеfile.json после нового запроса (без перезапуска программы) данные будут от первой загрузки. У меня нет источника, чтобы поддержать это, но у меня было это в приложении, которое я строю

    от
  • Другая проблема / преимущество такого метода заключается в том, что требуемые данные кэшируются, если вы не удалили специально кэшированный экземпляр.

    от
  • Ваш ответ ужасно неполный. То, что это дает вам, является объектом, и он даже не удосуживается реализовать tostring ().

    от
  • @ DavidA.Gray Вопрос хочет иметь возможность доступа к объектам как к объектам, а не как к строкам. Помимо одиночного вопроса Лукас упомянул, что этот ответ в порядке.

    от
  • Отлично :-) Мне не нравятся встроенные обратные вызовы, хотя, это может привести к кошмарам обратного вызова, которых я бы предпочел избежать.

    от
  • Просто, чтобы люди знали, и если я правильно помню,require в узле работает синхронно. Погружение в глубинуhere

    от
  • @ Рам Это работает для меня, может быть, ваше местоположениеtest.json будет отличаться от его примера. я используюnode 5.0

    от
  • Это по какой-то причине ... если вы не хотите синхронно.

    от
  • согласился :), также добавил async

    от
  • Если вы хотите использовать обещания, есть такжеfs/promises с узла 10. Примечание: API является экспериментальным:nodejs.org/api/fs.html#fs_fs_promises_api

    от
  • .readFile уже является асинхронным, если вы ищете версию синхронизации, ее имя.readFileSync.

    от
  • Я думаю, что JSON.parse является синхронным, напрямую из v8, что означает, что даже при использовании Async люди должны быть осторожны с большими файлами JSON. так как это связало бы узел.

    от
  • Еще один момент: это асинхронно, но это не такstreaming, Для этого вам понадобится библиотека (например, Oboe.js). Разница в том, что асинхронность не будет блокировать ваш поток выполнения, но если вы не будете транслировать свои потоки, вы все равно увидите огромные всплески потребления памяти (например, 450 МБ памяти при обработке файла JSON 70 МБ).

    от
  • & Quot; требуется & Quot; предназначен для загрузки модулей или конфигурационных файлов, которые вы используете, в течение всего срока службы вашего приложения. не кажется правильным использовать это для загрузки файлов.

    от
  • два момента: (1) синхронный ответ должен бытьlet imported = require("file.json"), (2) JSON.parse должен быть асинхронным, потому что я использовал этот код для загрузки 70-мегабайтного файла JSON в память как объекта. Это займет миллисекунды таким образом, но если я используюrequire(), Этоchugs.

    от
  • Я не могу поверить, что было так трудно найти эту простую вещь. Каждый ответ, который я получил от google, делал HTTPRequest или JQuery, или делал это в браузере

    от
  • Ради полноты. Их существует нпм называетсяjsonfile.

    от
  • Для меня это не работает :(

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

    от mpm
7 ответов
  • -2

    router

    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

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

  • 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
    }
    

  • 336

    Самый простой способ, который я нашел, это просто использовать

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

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

    test.json

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

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

    var config = require('./test.json');
    console.log(config.firstName + ' ' + config.lastName);
    

  • 26

    По крайней мере, в Node v8.9.1 вы можете просто сделать

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

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

  • 1

    var fs = require('fs');

    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

    В Node 8 вы можете использовать встроенный

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