簡體   English   中英

node - fs.writeFile 創建一個空白文件

[英]node - fs.writeFile creates a blank file

我正在嘗試在 grunt-search 回調中編寫一個新文件。

該過程獲取和對象,遍歷它獲取一些數據,創建一個新數組,然后將該數組寫入 JSON 文件。 寫作部分不太好...

// onComplete is the callback, job is a returned object.
onComplete: function(job) {
    console.log("Creating file \"localize_template\"...");
    var fs = require('fs');
    var localArray = {};
    var foundEntries = job.matches;

    var stringCount = 0;

    // Drill down to the strings that matched the search.
    for (var foundEntry in foundEntries) {
        // Stay on target...
        if (foundEntries.hasOwnProperty(foundEntry)) {
            var singleEntry = foundEntries[foundEntry];
            // Almost...there...
            for( var match in singleEntry ) {
                if (singleEntry.hasOwnProperty(match)) {

                    // Direct hit!  We've drilled down to the match string itself.
                    var theMatch = singleEntry[match].match;

                    // Now, get the terms inside the strings that were referenced.
                    var terms = theMatch.match(/".*?"/g);

                    // Iterate through those strings and add them as entries in the localArray.
                    for( var i=0; i<terms.length; i++ ) {
                        var term = terms[i].replace(/"/g, '');

                        localArray[term] = 'xx:'+term;
                        stringCount++;
                    }
                }
            }
        }
    }

    fs.writeFile( 'i18n/localize_template.json', localArray, {encoding: 'utf8'}, function(err){
        console.log("File localize_template.json create successfully.");
        if(err) {
            throw err;
        } else {
           console.log("File localize_template.json create successfully.");
        }
    });    
}

正在創建文件,但它是空白的。 我試過使用通用的Hello World! string 而不是localArray來測試,但文件仍然是空白的。

您需要使用同步版本:

fs.writeFileSync("./output.txt", "file contents"); 

為了更清楚地回答, fs.writeFile是異步的,頂級 grunt 的東西不知道等待onComplete啟動的異步操作。 您需要弄清楚如何告訴 grunt 您有一個未完成的異步操作,除非這是grunt-search不支持的功能 否則,當您從onComplete返回時, grunt-search將立即將任務標記為完成,並且 grunt 將退出導致節點進程在異步寫入完成之前退出。

另一個想法是使用grunt.file.write() 這是一個同步 API,所以它不需要你解決無法告訴 grunt 你的任務沒有完成的問題。 此外,使用此 API 將使您的代碼神奇地支持 grunt 的--no-write選項,因為當用戶請求試運行時,它是無操作的。

onComplete: function (matches) {
    grunt.file.write('test', JSON.stringify(matches));
},

嘗試找出您的代碼是否具有

進程.退出()

出於某種原因,我有一個溫和的僅供測試。 如果你這樣做了,注釋掉這個,你就可以開始了。 我的版本是 v8.6.0。

您的問題應該是 fs.writeFile 開始“異步”。 嘗試更改此處的 localArray(對其進行硬編碼以查看它是否有效):

fs.writeFile( 'i18n/localize_template.json', localArray, callback)

它應該在那里工作。 我認為的解決方案是您應該使用 fs.writeFileSync,或者在 oncomplete 函數之外初始化 localArray,然后再啟動。

到 2020 年,在async函數中,使用await如下:

try {
    // blah blah


    // Write data to the file
    await fs.writeFile(path, data, function (err) {
        if (err) {
            console.error(`An error occurred while writing data to the file: ${err.message}`)
            throw err
        }
    })

    // blah blah
}
catch(err) {
    console.error(`An error occurred while writing data to the file: ${err.message}`)
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM