Я разработал nodeJS API (с помощью экспресс), который позволяет пользователям входить в систему и получать список файлов, которые они хранят на удаленном сервере. И, как вы понимаете, код должен быть неблокирующим, поэтому веб-сервер может реагировать на ведение журнала в запросах, даже если некоторые пользователи выбирают свои списки файлов.nodeJS блокирует все запросы до тех пор, пока не перезвонит
Каждый раз, когда пользователь делает запрос на получение списка своих файлов, вызывается функция listOfFiles.
Это код:
exports.listOfFiles = function(req,res){
db.Account.find({where: {id:1}}).then(function(newAcc){
console.log("encontrou a account");
getFiles('/', newAcc.accessToken, '0', newAcc, function(error){
if (error) {
log.error('Error getting files');
}else{
console.log("callback!")
}
});
});
}
GetFiles функционировать: эта функция отвечает за выборку списка файлов с удаленного сервера, и хранить их в базе данных Postgres
function getFiles(path, accessToken, parentID, newAcc, callback){
var client = new ExternalAPI.Client({
key: config.get("default:clientId"),
secret: config.get("default:clientSecret")
});
client._oauth._token = accessToken;
var options = {
removed : false,
deleted : false,
readDir: true
}
//this is the instruction that fetch an array of items
//(metadata only) from a remote server
client.stat(path, options, function(error, entries) {
if (error) {
if (error.status == 429) {
console.log(accessToken + 'timeout')
setTimeout(
getFiles(path, accessToken, parentID, callback),
60000);
}else{
log.error(error);
callback(error,null);
}
}
else {
//When the array os items arrives:
console.log("RECEIVED FILES")
var inserted = 0;
var items = entries._json.contents;
for(var file in items){
var skyItemID = uuid.v1();
var name = items[file].path.split('/').pop();
var itemType;
if (items[file].is_dir) {
itemType = 'folder';
}else{
itemType = 'file';
}
newAcc.createItem({
name : name,
lastModified: items[file].modified,
skyItemID: skyItemID,
parentID: parentID,
itemSize: items[file].bytes,
itemType : itemType,
readOnly: items[file].read_only,
mimeType: items[file].mime_type
}).then(function(item){
console.log(item.name)
if (++inserted == items.length) {
console.log(inserted)
console.log(items.length)
console.log("callsback")
callback();
}
}).catch(function(error){
log.error('[DROPBOX] - Filename with special characters');
callback(new Error);
return;
});
}
}
});
}
проблема в том, что веб-сервер печатает console.log("RECEIVED FILES")
в нашей консоли, он перестает отвечать на все остальные запросы, такие как вход в систему или выборка запросов файлов от других пользователей.
И он начинает отвечать снова, когда печатает console.log("callback!")
. Итак, я предполагаю, что каким-то образом nodeJS блокирует себя до тех пор, пока функция getFiles
не будет закончена и не будет возвращена.
Я думаю, что это не нормальное поведение. Должна ли nodeJS отвечать на реакцию на другие запросы, даже если в фоновом режиме выполняются некоторые операции? Должна ли функция getFiles
работать в фоновом режиме и не затрагивать/блокировать все остальные запросы? Что я делаю не так?
Спасибо!
Что такое 'createItem()' делать? – mscdex
Возможный дубликат [Для цикла в обратном вызове. Блокировка?] (Http://stackoverflow.com/questions/22002047/for-loop-in-callback-blocking) –
mscdex: 'createItem()' отвечает за создание элемента в базе данных. Это функция sequelize (NodeJS ORM) http://docs.sequelizejs.com/en/latest/ –