मुझे यूआरएल (पीडीएफ) से फाइलें लेने की जरूरत है और उन्हें एक वैकल्पिक फाइल सिस्टम में स्टोर करना होगा जो बफर का उपयोग करता है। मुझे जो मिलता है वह यूआरएल के लिए काम करता है और फ़ाइल स्थानीय रूप से सहेजी जाती है लेकिन फिर जब मैं कोशिश करता हूं और बफर प्राप्त करता हूं तो यह खाली होता है।

जब मैं दूसरी बार चलाता हूं जब फ़ाइल पहले से ही सहेजी गई थी तो यह काम करती है। मुझे लगता है कि यह किसी तरह फाइल को बंद करने से संबंधित है। क्या किसी के पास कोई विचार है? मेरा कोड इस प्रकार है -

function savefile(filename, url) {

    const file = fs.createWriteStream(filename);
    const request = https.get(url, function(response) {
      response.pipe(file);
            console.log("file saved");
            return file;
    });;
}

app.post('/addfile', function(req, res) {

    var filename = req.body.filename;
    var url = req.body.url;
    var file = savefile(filename, url);
    let testFile = fs.readFileSync(filename);
    let testBuffer = new Buffer(testFile);
    // process testBuffer
0
Trevor Lee Oakley 17 जुलाई 2019, 15:01

1 उत्तर

सबसे बढ़िया उत्तर

मुझे लगता है कि यहां समस्या यह है कि जब आप सेवफाइल को कॉल करते हैं, तो डेटा को पढ़ने और डिस्क पर सहेजने से पहले यह वापस आ जाता है।

इसका मतलब है कि जब आप fs.readFileSync को कॉल करते हैं, तो फ़ाइल डेटा अभी मौजूद नहीं होता है। फ़ाइल मौजूद होने से पहले इसमें कुछ सौ मिलीसेकंड लग सकते हैं। याद रखें कि https.get फ़ंक्शन ब्लॉकिंग नहीं है (जैसे Node.js में अधिकांश I/O फ़ंक्शन)।

तो आगे बढ़ने का सबसे अच्छा तरीका यह है कि या तो कॉलबैक फ़ंक्शन का उपयोग यह इंगित करने के लिए करें कि हम कब काम कर रहे हैं, या किसी प्रॉमिस का उपयोग करें। मैं आमतौर पर बाद वाले को पसंद करता हूं, क्योंकि कोड सिंटैक्स क्लीनर है।

उदाहरण के लिए (एक वादे के साथ):

function savefileWithPromise(filename, url) {
    return new Promise((resolve, reject) => {

        // Create file and setup close handler.
        const file = fs.createWriteStream(filename)
            .on('close', () => resolve("File end"));

        // Read data from url..the file.close handler will fire when the response has been piped to the file stream.
        https.get(url, function(response) {
            response.pipe(file);
        });
    });
}

app.post('/addfile', async function(req, res) {
    var filename = req.body.filename;
    var url = req.body.url;
    console.log(`/addfile: Reading from url: ${url}, writing to file ${filename}...`);
    await savefileWithPromise(filename, url);
    // readFileSync returns a buffer.
    let testFile = fs.readFileSync(filename);
    console.log("File length: " + testFile.length + " byte(s).")
    res.status(200).send("ok");
});

हम कॉलबैक के साथ भी यही काम कर सकते हैं:

function savefileWithCallback(filename, url, callback) {
    // Create file and setup close handler.
    const file = fs.createWriteStream(filename)
        .on('close', () => callback("File end"));

    // Read data from url..
    https.get(url, function(response) {
        response.pipe(file);
    });
}

app.post('/addfile', function(req, res) {
    var filename = req.body.filename;
    var url = req.body.url;
    console.log(`/addfile: Reading from url: ${url}, writing to file ${filename}...`);
    savefileWithCallback(filename, url, function() {
        // readFileSync returns a buffer.
        let testFile = fs.readFileSync(filename);
        console.log("File length: " + testFile.length + " byte(s).")
        res.status(200).send("ok");
    });
});

और फिर यूआरएल डेटा को बफर में पढ़ने के लिए:

function readUrlDataToBuffer(url) {
    return new Promise((resolve, reject) => {
        https.get(url, function(response) {
            const data = [];
            response.on('data', function(chunk) {
                data.push(chunk);
            }).on('end', function() {
                resolve(Buffer.concat(data));
            })
        }).on('error', function(err) {
            reject(err);
        });
    });
}

app.post('/addfile', async function(req, res) {
    try {
        var url = req.body.url;
        console.log(`/addfile: Reading from url: ${url}..`);
        let buffer = await readUrlDataToBuffer(url);
        console.log("Buffer length: " + buffer.length + " byte(s).");
        res.send('ok');
    } catch (error) {
        res.status(500).send('An error occurred');
    }
});
1
Terry Lennox 17 जुलाई 2019, 14:01