我开发了一个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
函数在后台运行而不影响/阻止所有其他请求吗?我做错了什么?
谢谢!
答案 0 :(得分:0)
我面临同样的问题,长时间服务器http请求阻止服务响应其他客户端请求。这是我的主题。 What is the correct behavior for Node.js while Node.js is requesting a long time http request for other servers目前,我没有得到答案。如果你有答案,请回复我。感谢。