[英]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.