2015-07-25 11 views
0

Я разработал 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 работать в фоновом режиме и не затрагивать/блокировать все остальные запросы? Что я делаю не так?

Спасибо!

+0

Что такое 'createItem()' делать? – mscdex

+0

Возможный дубликат [Для цикла в обратном вызове. Блокировка?] (Http://stackoverflow.com/questions/22002047/for-loop-in-callback-blocking) –

+0

mscdex: 'createItem()' отвечает за создание элемента в базе данных. Это функция sequelize (NodeJS ORM) http://docs.sequelizejs.com/en/latest/ –

ответ

0

Я столкнулся с такой же проблемой в течение длительного времени HTTP-запрос сервера блокирует службу для ответа на другие запросы клиентов. Это моя тема. What is the correct behavior for Node.js while Node.js is requesting a long time http request for other servers В настоящее время у меня нет ответа. Если у вас есть ответ, ответьте мне. Благодарю.