Node.js के साथ फ़ाइल में ऑब्जेक्ट लिखें


83

मैंने इसके लिए स्टैकओवरफ़्लो / Google पर सभी खोज की है, लेकिन यह पता नहीं लगा सकता।

मैं किसी दिए गए URL पृष्ठ के सोशल मीडिया लिंक को स्क्रैप कर रहा हूं, और फ़ंक्शन URL की सूची के साथ एक ऑब्जेक्ट देता है।

जब मैं इस डेटा को एक अलग फ़ाइल में लिखने का प्रयास करता हूं, तो यह [object Object]अपेक्षित के बजाय फ़ाइल में आउटपुट करता है: [' https://twitter.com/# ! / 101Cookbooks ', ' http://www.facebook.com/ 101cookbooks '] जब मैं console.log()परिणाम करता हूं तो यह होता है ।

नोड में एक फाइल को पढ़ने और लिखने का यह मेरा दुखद प्रयास है, एक समारोह के माध्यम से प्रत्येक पंक्ति (यूआरएल) और इनपुट को पढ़ने की कोशिश कर रहा है request(line, gotHTML):

fs.readFileSync('./urls.txt').toString().split('\n').forEach(function (line){
    console.log(line); 
    var obj = request(line, gotHTML); 
    console.log(obj); 
    fs.writeFileSync('./data.json', obj , 'utf-8'); 
});   

संदर्भ के लिए - gotHTMLसमारोह:

function gotHTML(err, resp, html){ 
    var social_ids = []; 

    if(err){
        return console.log(err); 
    } else if (resp.statusCode === 200){ 
        var parsedHTML = $.load(html); 

        parsedHTML('a').map(function(i, link){
            var href = $(link).attr('href');
            for(var i=0; i<socialurls.length; i++){
                if(socialurls[i].test(href) && social_ids.indexOf(href) < 0 ) {
                    social_ids.push(href); 
                }; 
            }; 
        })
    };

    return social_ids;
};

3
[object Object]एक वस्तु है toString। यदि आप ऑब्जेक्ट का प्रतिनिधित्व चाहते हैं, तो उपयोग करें JSON.stringify
एलक्लेनर्स

2
से सावधान रहें JSON.stringify। सरणियों के साथ, आप सुरक्षित हैं, लेकिन जब वस्तुओं में परिपत्र संदर्भ होते हैं तो यह विफल हो जाएगा ( इस विषय को देखें )। utilमॉड्यूल वृत्तीय संदर्भ संभालती है।
जिम स्कुबर्ट

जवाबों:


71

obj आपके उदाहरण में एक सरणी है।

fs.writeFileSync (फ़ाइल नाम, डेटा, [विकल्प])String या तो या Bufferडेटा पैरामीटर में आवश्यक है। डॉक्स देखें

सरणी को स्ट्रिंग प्रारूप में लिखने का प्रयास करें:

// writes 'https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks'
fs.writeFileSync('./data.json', obj.join(',') , 'utf-8'); 

या:

// writes ['https://twitter.com/#!/101Cookbooks', 'http://www.facebook.com/101cookbooks']
var util = require('util');
fs.writeFileSync('./data.json', util.inspect(obj) , 'utf-8');

संपादित करें: आप अपने उदाहरण में सरणी देखते हैं इसका कारण यह है कि नोड का कार्यान्वयन console.logकेवल कॉल नहीं करता है toString, यह util.format कंसोल को देखता है। जेएस स्रोत


5
यदि आपकी ऑब्जेक्ट में बड़ी सरणियाँ हैं, तो यह काम नहीं करेगा क्योंकि निरीक्षण विधि "45000 और ..." जैसी किसी चीज़ का उत्पादन करेगी
Coxer

96

क्या deb2fast ने कहा कि मैं इसे JSON.stringify () के लिए अतिरिक्त मापदंडों के एक जोड़े में पास करूंगा, इसे सुंदर प्रारूप में लाने के लिए:

fs.writeFileSync('./data.json', JSON.stringify(obj, null, 2) , 'utf-8');

दूसरा पैराम एक वैकल्पिक प्रतिकृति फ़ंक्शन है जिसे आपको इस मामले में ज़रूरत नहीं है इसलिए nullकाम करता है।

तीसरा परम स्थान इंडेंटेशन के लिए उपयोग करने के लिए रिक्त स्थान की संख्या है। 2 और 4 लोकप्रिय विकल्प प्रतीत होते हैं।


यह परिपत्र निर्भरता समस्या पैदा करने वाला है। दो-तरफ़ा निर्भरताएँ JSON में परिवर्तित नहीं की जा सकीं।
ओज़ान एर्टर्क

लिखित पाठ फ़ाइल फ़ाइल के अंत में नई पंक्ति वर्ण याद कर रही है। इसे ठीक करने का कोई उपाय?
फ्राइडेरब्लुमेमले

1
@friederbluemle - आप + '\n'उस न्यूलाइन को जोड़ने के लिए उस स्ट्रिंग को () कॉल कर सकते हैं।
गाय

1
इस एक ने मेरे लिए सबसे अच्छा काम किया क्योंकि स्वीकृत उत्तर का उपयोग करने से मुझे गलत परिणाम मिला।
अंशुमान कुमार

20

यदि आप प्राप्त कर रहे हैं [object object]तो उपयोग करेंJSON.stringify

fs.writeFile('./data.json', JSON.stringify(obj) , 'utf-8');

इसने मेरे लिए काम किया।


10

मेरे अनुभव में JSON.stringify, use.inspect से थोड़ा तेज है। मुझे एक DB2 क्वेरी के परिणाम ऑब्जेक्ट को एक json फ़ाइल के रूप में सहेजना पड़ा, क्वेरी ने 92k पंक्तियों की एक वस्तु लौटा दी, रूपांतरण का उपयोग करने में बहुत समय लगा ।inspect, इसलिए मैंने उसी 1000 रिकॉर्ड ऑब्जेक्ट को लिखकर निम्नलिखित परीक्षण किया। दोनों तरीकों के साथ एक फ़ाइल के लिए।

  1. JSON.Stringify

    fs.writeFile('./data.json', JSON.stringify(obj, null, 2));
    

समय: 3:57 (3 मिनट 57 सेकंड)

परिणाम का प्रारूप:

[
  {
    "PROB": "00001",
    "BO": "AXZ",
    "CNTRY": "649"
   },
  ...
]
  1. का उपयोग करें

    var util = require('util');
    fs.writeFile('./data.json', util.inspect(obj, false, 2, false));
    

समय: 4:12 (4 मिनट 12 सेकंड)

परिणाम का प्रारूप:

[ { PROB: '00001',
    BO: 'AXZ',
    CNTRY: '649' },
    ...
]

4

क्या आप JSON.stringify (obj) करने की कोशिश कर सकते हैं;

ऐशे ही

 var stringify = JSON.stringify(obj);
fs.writeFileSync('./data.json', stringify , 'utf-8'); 

1

बस किसी और को इस पर ठोकर खाने के लिए, मैं नोड में fs-extra पुस्तकालय का उपयोग करता हूं और इस पर एक फ़ाइल के लिए जावास्क्रिप्ट ऑब्जेक्ट्स लिखता हूं:

const fse = require('fs-extra');
fse.outputJsonSync('path/to/output/file.json', objectToWriteToFile); 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.