Node.js json文件被另一个调用覆盖

我正在尝试通过编写配方应用程序来学习Node + Express和Angular。

我在我的数据存储在一个json文件中存储食谱和一个成分数组,我在节点中有一个简单的saveMeal()和saveIngredient()方法,像这样:

exports.saveIngredient = function(req, res) { var ing = req.body; console.log('Saving Ingredient: ' + JSON.stringify(ing, null, 4)); fs.readFile('./data/data.json', 'utf-8', function (error, data) { var mData = JSON.parse(data); ing.id = generateId(ing.name, mData.ingredients); mData.ingredients.push(ing); fs.writeFile('./data/data.json', JSON.stringify(mData, null, 4), function(err) { res.writeHead(200, { 'Content-Type': 'text/json' }); res.end(ing.id, 'utf-8'); }); }); }; 

我遇到的问题是,Angular应用程序触发了一系列调用返回到节点,以保存每个成分,而不必等待每一个完成,然后发射下一个电话,虽然每个电话返回一个id的成分,只有最后一个元素保存,所以最后的调用必须覆盖之前的数据。

我知道我可以改变Angular应用程序的工作方式,在保存下一个成分之前等待响应,但我有点感觉Node应用程序应该能够支持这样的请求。 有没有办法locking文件或我应该采取的另一种方法?

问题是,您正在运行多个请求来同时保存该文件。

保存A到达并asynchronous加载文件 – 在此期间,保存B到达并加载之前保存A已承诺其更改。

解决方法是一次只运行这些保存请求中的一个 – 像这样的(我没有testing过)保存一系列的保存函数和块通过它们到达的顺序:

 // an array of functions in the queue var fnBuffer = [] // are we currently running a function in the queue var running = false // run the queue one at a time - on finish run again function runSave(){ if(running) return running = true var nextfn = fnBuffer.shift() if(!nextfn) return nextfn(function(){ running = false runSave() }) } exports.saveIngredient = function(req, res) { // push the function onto the queue fnBuffer.push(function(callback){ // this is the original code - the only extra is the callback var ing = req.body; console.log('Saving Ingredient: ' + JSON.stringify(ing, null, 4)); fs.readFile('./data/data.json', 'utf-8', function (error, data) { var mData = JSON.parse(data); ing.id = generateId(ing.name, mData.ingredients); mData.ingredients.push(ing); fs.writeFile('./data/data.json', JSON.stringify(mData, null, 4), function(err) { res.writeHead(200, { 'Content-Type': 'text/json' }); res.end(ing.id, 'utf-8'); // running this callback tells the queue to run the next function callback() }); }); }) // trigger the queue runSave() };