node - fs.writeFile创建一个空文件

时间:2015-07-22 19:38:40

标签: javascript node.js

我试图在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!字符串代替localArray进行测试,但该文件仍为空白。

5 个答案:

答案 0 :(得分:8)

您需要使用同步版本:

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

答案 1 :(得分:6)

为了更清楚地回答,fs.writeFile是异步的,顶级的grunt东西不知道等待onComplete启动的异步操作。您需要弄清楚如何告诉grunt您有一个未完成的异步操作,this is a feature that grunt-search doesn’t support除外。否则,当您从onComplete返回时,grunt-search会立即将任务标记为已完成,并且grunt将退出,导致节点进程在异步写入完成之前退出。

另一个想法是使用grunt.file.write()。这是一个同步API,所以它不需要你解决无法告诉grunt你的任务没有完成的问题。此外,当用户请求干运行时,使用此API将使您的代码通过无操作来神奇地支持grunt的--no-write选项。

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

答案 2 :(得分:2)

你的问题应该是fs.writeFile启动&#34;异步&#34;。 尝试在这里更改localArray(硬编码以查看它是否有效):

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

它应该有效。 解决方案我认为你应该在启动之前使用fs.writeFileSync,或者在oncomplete函数之外初始化localArray。

答案 3 :(得分:2)

尝试找出您的代码是否有

  

process.exit()

出于某种原因,我只有一个温和的测试。如果你这样做,请注释掉这个,你会很高兴。我的版本是v8.6.0。

答案 4 :(得分:0)

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