我试图在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
进行测试,但该文件仍为空白。
答案 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}`)
}