নোড.জেএস ব্যবহার করে, আমি কীভাবে একটি JSON ফাইল (সার্ভার) মেমরিতে পড়তে পারি?


618

পটভূমি

আমি নোড.জেএস এর সাথে কিছু পরীক্ষা নিরীক্ষা করছি এবং একটি জেএসওএন অবজেক্টটি পাঠ্য ফাইল বা .js ফাইল (যা আরও ভাল ??) থেকে মেমরিতে পড়তে চাই যাতে আমি কোড থেকে সেই অবজেক্টটি দ্রুত অ্যাক্সেস করতে পারি। আমি বুঝতে পারি যে মঙ্গো, আলফ্রেড ইত্যাদির মতো জিনিসগুলি এখানে আছে তবে এখনই আমার এটি প্রয়োজন নেই।

প্রশ্ন

আমি কোনও পাঠ্য বা জেএস ফাইলের বাইরে এবং জাভাস্ক্রিপ্ট / নোড ব্যবহার করে সার্ভার মেমরির মধ্যে একটি JSON অবজেক্টটি কীভাবে পড়ব?


1
আপনি কি সার্ভার মেমরি কল? আপনার নোডেজের স্ক্রিপ্টটি যতক্ষণ আপনি এটি কাজ করবেন ততক্ষণ কাজ করবে তবে নোডেজ স্ক্রিপ্টটি যদি আপনি দৃistant়তর না করেন তবে আপনাকে কোথাও ডেটা সংরক্ষণ করতে হবে।
এমপিএম

উত্তর:


1203

সুসংগত:

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

15
আমি মনে করি JSON.parse সিঙ্ক্রোনাস, এটি সরাসরি ভি 8 থেকে, যার অর্থ এমনকি এসিঙ্ক পদ্ধতিতেও লোকেরা বড় জেএসএন ফাইলগুলির সাথে সতর্ক থাকতে হবে। যেহেতু এটি নোড টাই হবে।
শান_এ 91

25
শেষ করার জন্য. তাদের উপস্থিতিতে জসনফাইল নামে একটি এনপিএম রয়েছে ।
স্টেফান

5
আমি বিশ্বাস করতে পারি না যে এই সাধারণ জিনিসটি পাওয়া খুব কঠিন ছিল। গুগলের কাছ থেকে পাওয়া প্রতিটি উত্তরই ছিল HTTPRequest করা বা JQuery ব্যবহার করা বা এটি ব্রাউজারে করা
জুলিয়ানগনজালেজ

6
দুটি বিষয়: (1) সমকালীন উত্তরটি ঠিক হওয়া উচিত let imported = require("file.json")। (২) JSON.parse অবশ্যই অবিচ্ছিন্ন হতে হবে, কারণ আমি একটি কোড হিসাবে একটি 70mb JSON ফাইল লোড করতে এই কোডটি ব্যবহার করেছি। এটি মিলিসেকেন্ডগুলি এইভাবে লাগে, তবে আমি যদি require()এটি ব্যবহার করি তবে এটি চাগে
কাইল বেকার

8
2019 এবং এর পরে লোকেরা এই উত্তরটি খুঁজে পাওয়ার জন্য, নোড.জেএস এর অনেকগুলি, অনেক সংস্করণের মাধ্যমে নেটিভ জেসন সমর্থন পেয়েছে require, আপনি যদি কোনও জেসন ফাইল লোড করতে চান তবে এই উত্তরটি আর কার্যকর হবে না। আপনি কেবল ব্যবহার করুন let data = require('./yourjsonfile.json')এবং বন্ধ করুন (বুকনোট সহ যে প্রয়োজনের পারফরম্যান্সটি যদি আপনার কোডকে প্রভাবিত করে তবে "একটি .json ফাইল লোড করতে ইচ্ছুক" এর বাইরেও আপনার সমস্যা রয়েছে)
মাইক 'পোম্যাক্স' কামারম্যানস

392

এটি করার সবচেয়ে সহজ উপায়টি হ'ল কেবল ব্যবহার করা requireএবং আপনার JSON ফাইলের পথ।

উদাহরণস্বরূপ, ধরুন আপনার নীচের JSON ফাইল রয়েছে।

test.json

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

এরপরে আপনি এটিকে সহজেই আপনার নোড.জেএস অ্যাপ্লিকেশনটিতে লোড করতে পারেন require

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

35
ঠিক তেমন ভাবেন লোকেরা জানেন, এবং আমি যদি সঠিকভাবে মনে রাখি তবে requireনোডে সিঙ্ক্রোনস চালিত হয়। এখানে
prasanthv

@ র্যাম এটি আমার পক্ষে কাজ করে test.jsonতার অবস্থান থেকে তার অবস্থানের অবস্থান আলাদা হতে পারে। আমি ব্যবহার করছিnode 5.0
30'15 এ গ্লেরিয়া

18
এই জাতীয় পদ্ধতির সাথে আরেকটি সমস্যা / উপকারিতা হ'ল সত্যটি প্রয়োজনীয় ডেটা ক্যাশে করা হয় যদি না আপনি সুনির্দিষ্টভাবে ক্যাশেড
মোছাটি

13
"আবশ্যক" বলতে বোঝায় মডিউল বা কনফিগারেশন ফাইলটি লোড করার জন্য যা আপনি নিজের অ্যাপ্লিকেশনটির আজীবন ব্যবহার করছেন। ফাইলগুলি লোড করার জন্য এটি ব্যবহার করা ঠিক বলে মনে হচ্ছে না।
ইয়াকি ক্লিন

2
আমি বলব এটি সম্ভবত একটি সুরক্ষা হুমকি। আপনি যে জোসন ফাইলটি লোড করছেন তাতে যদি জেএস কোড থাকে তবে requireএটি কি কোড চালাবে? যদি তা হয় তবে আপনার জাসন ফাইলগুলি কোথা থেকে আসছে বা কোনও আক্রমণকারী আপনার মেশিনে দূষিত কোড চালাতে পারে তা নিয়ন্ত্রণ করতে হবে।
sokkyoku

57

অ্যাসিঙ্ক্রোনাস একটি কারণ আছে! @ মিহাইকে পাথর ফেলেছে

অন্যথায়, তিনি এখানে অ্যাসিক্রোনাস সংস্করণটি সহ কোডটি ব্যবহার করেছেন:

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

9
সম্মত হয়েছে :), async পাশাপাশি যুক্ত করেছেন
মিহাই

1
দুর্দান্ত :-) যদিও আমি ইনলাইন কলব্যাক পছন্দ করি না, এটি কলব্যাকের দুঃস্বপ্নগুলিতে ডেকে আনতে পারে যা আমি বরং এড়াতে পারি।
ফ্লোরিয়ান মার্জাইন

9
এটি একটি কারণের জন্য রয়েছে .. যদি না আপনি এটি সুসংগতভাবে চান।
ম্যাট স্টিফেন্স

40

কমপক্ষে নোড v8.9.1 এ, আপনি ঠিক করতে পারেন

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

এবং JSON অবজেক্টের সমস্ত উপাদান অ্যাক্সেস করুন।


5
এই পদ্ধতির ফাইলটি একবারে লোড করে। আপনি যদি file.jsonনতুন প্রয়োজনীয়তার পরে পরিবর্তন করবেন (প্রোগ্রাম পুনরায় আরম্ভ না করে) ডেটা হবে প্রথম লোড থেকে। এর ব্যাক করার কোনও উত্স আমার কাছে নেই, তবে আমি এটি তৈরি করছি এমন অ্যাপটিতে আমি
পেয়েছিলাম

আপনার উত্তর হ'ল দুর্ভাগ্যজনকভাবে অসম্পূর্ণ। আপনাকে যা দেয় তা হ'ল একটি বস্তু এবং এটি টস্ট্রিং () প্রয়োগ করতে এমনকি বিরক্ত করে না।
ডেভিড এ। গ্রে

3
@ ডেভিডএ.গ্রায় প্রশ্নটি বস্তুগুলিকে স্ট্রিং হিসাবে নয়, বস্তু হিসাবে অ্যাক্সেস করতে সক্ষম হতে চায়। সিংগলন ইস্যু বাদ দিয়ে লুকাশ এই উত্তরটি ভাল বলে উল্লেখ করেছে।
মাইকম্যাকানা

2
প্রয়োজনীয় ব্যবহারের ফলে ফাইলটিতে স্বেচ্ছাসেবক কোড কার্যকর করা হবে। এই পদ্ধতিটি নিরাপত্তাহীন এবং আমি এর বিরুদ্ধে সুপারিশ করব।
স্পোলসন

16

নোড 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
  })

3
.readFileইতিমধ্যে ASYNC আপনি সিঙ্ক সংস্করণ খুঁজছেন হন, তাহলে এটির নাম হয়, .readFileSync
আটার্নস

আপনি যদি প্রতিশ্রুতি ব্যবহার করতে চান তবে fs/promisesনোড 10 হিসাবেও রয়েছে Note দ্রষ্টব্য: API টি পরীক্ষামূলক: nodejs.org/api/fs.html#fs_fs_promises_api
প্রায়

@Aternus .readFileহয় অ্যাসিঙ্ক্রোনাস , কিন্তু না async। অর্থ, ফাংশনটি asyncকীওয়ার্ড দিয়ে সংজ্ঞায়িত করা হয় নি, বা এটি কোনও প্রতিশ্রুতিও দেয় না, তাই আপনি করতে পারবেন নাawait fs.readFile('whatever.json');
1:39

@ কীপ একটি কোডস্যান্ডবক্স সম্পর্কে কীভাবে?
আটার্নাস



3
function parseIt(){
    return new Promise(function(res){
        try{
            var fs = require('fs');
            const dirPath = 'K:\\merge-xml-junit\\xml-results\\master.json';
            fs.readFile(dirPath,'utf8',function(err,data){
                if(err) throw err;
                res(data);
        })}
        catch(err){
            res(err);
        }
    });
}

async function test(){
    jsonData = await parseIt();
    var parsedJSON = JSON.parse(jsonData);
    var testSuite = parsedJSON['testsuites']['testsuite'];
    console.log(testSuite);
}

test();

2

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

var fs = require('fs');  

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

আপনি ফাইল সিস্টেম ডক্সে নোড.জেএস এর সমস্ত ব্যবহার খুঁজে পেতে পারেন!
আপনার জন্য এই সাহায্য আশা করি!


0

এতগুলি উত্তর, এবং সিঙ্ক বনাম অ্যাসিঙ্ক বনাম প্রয়োজনীয় তুলনা করার জন্য কেউ কখনও কোনও মানদণ্ড তৈরি করে নি। আমি পার্থক্য প্রয়োজন, readFileSync এবং readFile মাধ্যমে স্মৃতিতে পড়া JSON এর ব্যবহারের ক্ষেত্রে বর্ণিত এখানে


-1

আপনি যদি ত্রুটি হ্যান্ডলিং দিয়ে Asyncকোনও JSON ফাইল লোড করার জন্য একটি সম্পূর্ণ সমাধান খুঁজছেনRelative Path

  // 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.
router.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 )
        }
   });
})

ডিরেক্টরি কাঠামো:

এখানে চিত্র বর্ণনা লিখুন

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.