UNPKG

nos-node-sdk

Version:

NOS Node.js SDK实现了NOS对象操作接口,基于此SDK能方便快速地实现JavaScript应用程序来使用NOS的对象存储服务。

145 lines (123 loc) 5.17 kB
/** * Created by hzlichaolin on 2016/7/14. * this module list more than one objects from a bucket */ var xml2js = require('xml2js'); var fs = require('fs'); var httpRequest = require('./httpRequest'); var inherits = require('./inherits'); var authrization = require('../services/authorization'); var querystring = require('querystring'); var encoder = require('../services/urlEncoder'); var bucketValidator = require('../services/validateBucketName'); var keyValidator = require('../services/validateKey'); var utils = require('../services/utils'); function listObjectsRequest() { httpRequest.call(this); this.options = {host: null, port: -1, path: null, method: 'GET', headers:{}, checkServerIdentity: function (host, cert) { return undefined; } }; this.bucketName = null; this.delimiter = null; this.marker = null; this.max_keys = null; this.prefix = null; } inherits(listObjectsRequest,httpRequest); listObjectsRequest.prototype.setBucketName = function (bucketName) { this.bucketName = bucketName; } listObjectsRequest.prototype.setDelimiter = function (delimiter) { this.delimiter = delimiter; } listObjectsRequest.prototype.setMarker = function (marker) { this.marker = marker; } listObjectsRequest.prototype.setMaxKeys = function (max_keys) { this.max_keys = max_keys; } listObjectsRequest.prototype.setPrefix = function (prefix) { this.prefix = prefix; } listObjectsRequest.prototype.sendRequest = function (func) { if (!bucketValidator(this.bucketName)){ throw new Error('invalid bucket name'); } var para = {}; if (this.delimiter != null){ para['delimiter'] = this.delimiter; } if (this.marker != null){ para['marker'] = this.marker; } if (this.max_keys != null){ para['max-keys'] = this.max_keys; } if (this.prefix != null){ para['prefix'] = this.prefix; } var query = querystring.stringify(para); if (query.length > 0){ query = '?'+query; } this.options.path = '/' ; this.options.host = this.bucketName + '.' + this.options.host; var resource = '/' + this.bucketName + '/'; this.options.headers['Date'] = (new Date()).toUTCString(); var authStr = authrization(this.accessId,this.secretKey,this.options.method,this.options.headers,resource); this.options.headers['Authorization'] = authStr; var responseFunc = function (res) { if (!utils.isOK(res.statusCode)){ res.on('data',function (body) { var parser = new xml2js.Parser(); parser.parseString(body,function (err, obj) { var errMessage = { statusCode:res.statusCode, errorCode:obj['Error']['Code'][0], message:obj['Error']['Message'][0], requestId:obj['Error']['RequestId'][0], resource:obj['Error']['Resource'[0]] }; errMessage = JSON.stringify(errMessage); throw new Error(errMessage); }); }); }else { var result = {}; result['statusCode'] = res.statusCode; result['headers'] = res.headers; var data = ''; res.on('data',function (chunk) { data += chunk; }); res.on('end',function () { var parser = new xml2js.Parser(); parser.parseString(data,function (err, obj) { result['bucketInfo'] = {}; result['bucketInfo']['name'] = obj['ListBucketResult']['Name'][0]; result['bucketInfo']['prefix'] = obj['ListBucketResult']['Prefix'][0]; result['bucketInfo']['marker'] = obj['ListBucketResult']['Marker'][0]; result['bucketInfo']['maxKeys'] = obj['ListBucketResult']['MaxKeys'][0]; result['bucketInfo']['is_truncated'] = obj['ListBucketResult']['IsTruncated'][0]; result['bucketInfo']['objectlist'] = []; var contents = obj['ListBucketResult']['Contents'] || []; for (var i=0;i<contents.length;i++){ var temp = {}; temp['key'] = contents[i]['Key'][0]; temp['etag'] = contents[i]['ETag'][0].replaceAll("\"",""); temp['lastmodified'] = contents[i]['LastModified'][0]; temp['size'] = contents[i]['Size'][0]; temp['storageclass'] = contents[i]['StorageClass'][0]; result.bucketInfo.objectlist[i] = temp; } func(result); }); }); } }; httpRequest.prototype.setProtocol(this.protocol); httpRequest.prototype.sendRequest(this.options,responseFunc); } module.exports = listObjectsRequest;