nodeJS阻止所有请求,直到它回调

时间:2015-07-25 12:51:47

标签: node.js callback blocking nonblocking event-loop

我开发了一个nodeJS API(使用express),允许用户登录并获取他们存储在远程服务器中的文件列表。如您所知,代码必须是非阻塞的,因此即使有一些用户提取他们的文件列表,Web服务器仍然可以响应登录请求。

每次用户发出获取文件列表的请求时,都会调用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;

                });
            }
        }
    });
}

这里的问题是,当webserver在我们的控制台中打印console.log("RECEIVED FILES")时,它会停止响应所有其他请求,例如登录或获取来自其他用户的文件请求。

它会在打印console.log("callback!")时再次开始响应。所以,我假设nodeJS以某种方式阻塞自己,直到getFiles函数完成并回调。

我认为这不是正常行为。即使在后台运行某些操作,nodeJS也不应该响应其他请求吗?不应该getFiles函数在后台运行而不影响/阻止所有其他请求吗?我做错了什么?

谢谢!

1 个答案:

答案 0 :(得分:0)

我面临同样的问题,长时间服务器http请求阻止服务响应其他客户端请求。这是我的主题。 What is the correct behavior for Node.js while Node.js is requesting a long time http request for other servers目前,我没有得到答案。如果你有答案,请回复我。感谢。