我想用MEAN堆棧來構建一個模擬plunker的簡單操場:左側有一個文件和一個textarea列表,右側有一個實時預覽。請注意,文件保存在臨時文件夾中,實時預覽是由該臨時文件夾中的文件注入的iframe
。對服務器中文件的連續寫入很慢
我有編碼的東西。在前端,控制器監視textarea中文件的修改;每次發生變化時,render
將被調用,它將發送一個$http.post
來保存所有文件的新版本。
app.controller('Ctrl', ['$scope', 'codeService', function ($scope, codeService) {
...
$scope.$watch('files', function() {
codeService.render($scope.files)
}, true);
}]);
app.service('codeService', ['$http', function ($http) {
this.render = function (files) {
...
var arrayLength = files.length;
for (var i = 0; i < arrayLength; i++) {
$http.post('/writeFile', files[i]);
}
}
}
在後端:
router.post('/writeFile', function (req, res, next) {
console.log("router.post /writeFile");
var file = req.body;
var fs = require('fs');
fs.writeFileSync("public/tmp/" + file.name, file.body);
});
我的測試表明,對於第一修改中,這的確是寫入到服務器上的文件。但是,對於連續修改,第二個和後續寫入可能需要超過20秒EACH。
有沒有人知道什麼減慢了作品(第一個除外)?
此外,我應該撥打$http.post('/writeFile', files[i])
或以異步方式寫router.post('/writeFile'...
?
編輯1:
我也想知道如果它是正確的寫入通過以下方式HTTP請求(我在具有同步功能內的異步函數(即,HTTP POST)(即, ?render
)我應該讓render
asynchonous):
app.service('codeService', ['$http', function ($http) {
this.render = function (files) {
...
var arrayLength = files.length;
for (var i = 0; i < arrayLength; i++) {
$http.post('/writeFile', files[i]);
}
}
}
當我看到在我的代碼中的其他HTTP請求,時尚往往喜歡
o.create = function (post) {
return $http.post('/posts', post, {
headers: { Authorization: 'Bearer ' + auth.getToken() }
}).success(function (data) {
o.posts.push(data)
});
};
不使用'fs.writeFileSync',使用異步版本 – wong2
^這。 \ * Sync功能背後的全部理念是它們阻止*。 – estus
謝謝...請參閱我的更新... – SoftTimur