Skip to content

Commit 45e4c44

Browse files
author
伯箫
committed
add node.js sdk
1 parent 7de150a commit 45e4c44

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+6366
-0
lines changed

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
##安装
2+
3+
```sh
4+
npm install tablestore
5+
```
6+
7+
##使用方法
8+
参考在samples目录下的代码示例,将samples/client中的相关参修改为自己实例的参数即可。
9+
10+
## License
11+
12+
This SDK is distributed under the
13+
[Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0).

index.js

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
var TableStore = require('./lib/core');
2+
module.exports = TableStore;

lib/client.js

+289
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,289 @@
1+
var TableStore = require('./core');
2+
var inherit = TableStore.util.inherit;
3+
4+
var capitalizeFirstLetter = function (string) {
5+
return string.charAt(0).toUpperCase() + string.slice(1);
6+
};
7+
8+
TableStore.Client = inherit({
9+
constructor: function Client(config) {
10+
this.config = new TableStore.Config(config);
11+
},
12+
13+
setupRequestListeners: function setupRequestListeners(request) {
14+
request.addListener('build', this.populateHeader);
15+
request.addListener('build', this.populateURI);
16+
request.addListener('build', this.buildContent);
17+
request.addListener('build', this.computeContentMd5);
18+
request.addListener('extractError', this.extractError);
19+
request.addListener('extractData', this.extractData);
20+
},
21+
22+
populateURI: function populateURI(req) {
23+
var httpRequest = req.httpRequest;
24+
httpRequest.endpoint.host = httpRequest.endpoint.hostname;
25+
httpRequest.path = '/' + TableStore.util.string.upperFirst(req.operation);
26+
},
27+
28+
populateHeader: function populateHeader(req) {
29+
var httpRequest = req.httpRequest;
30+
httpRequest.headers['x-ots-apiversion'] = '2015-12-31';
31+
httpRequest.headers['x-ots-instancename'] = req.config.instancename;
32+
},
33+
34+
buildContent: function buildContent(req) {
35+
var request = TableStore.encoder.encode(req.operation, req.params);
36+
var buffer = request.encode();
37+
req.httpRequest.body = buffer.toBuffer();
38+
},
39+
40+
computeContentMd5: function computeContentMd5(req) {
41+
var md5 = TableStore.util.crypto.md5(req.httpRequest.body, 'base64');
42+
req.httpRequest.headers['x-ots-contentmd5'] = md5;
43+
},
44+
45+
/**
46+
* Provides a specialized parser for getBucketLocation -- all other
47+
* operations are parsed by the super class.
48+
*
49+
* @api private
50+
*/
51+
extractData: function extractData(resp) {
52+
resp.data = TableStore.decoder.decode(resp.request.operation, resp.httpResponse.body);
53+
54+
// extract request id
55+
resp.data.RequestId = resp.httpResponse.headers['x-ots-request-id'] ||
56+
resp.httpResponse.headers['x-ots-requestid'];
57+
},
58+
59+
/**
60+
* Extracts an error object from the http response.
61+
*
62+
* @api private
63+
*/
64+
extractError: function extractError(resp) {
65+
var codes = {
66+
304: 'NotModified',
67+
403: 'Forbidden',
68+
400: 'BadRequest',
69+
404: 'NotFound'
70+
};
71+
72+
var code = resp.httpResponse.statusCode;
73+
var body = resp.httpResponse.body;
74+
if (codes[code] && body.length === 0) {
75+
resp.error = TableStore.util.error(new Error(), {
76+
code: codes[resp.httpResponse.statusCode],
77+
message: null,
78+
headers: resp.httpResponse.headers
79+
});
80+
} else {
81+
var data;
82+
try {
83+
data = new TableStore.XML.Parser({}).parse(body.toString());
84+
resp.error = TableStore.util.error(new Error(), {
85+
code: data.Code || code,
86+
message: data.Message || null,
87+
headers: resp.httpResponse.headers
88+
});
89+
}
90+
catch (e) {
91+
data = body.toString();
92+
resp.error = TableStore.util.error(new Error(), {
93+
code: code,
94+
message: data,
95+
headers: resp.httpResponse.headers
96+
});
97+
}
98+
}
99+
},
100+
101+
/**
102+
* @api private
103+
*/
104+
defaultRetryCount: 3,
105+
/**
106+
* Calls an operation on a service with the given input parameters.
107+
*
108+
* @param operation [String] the name of the operation to call on the service.
109+
* @param params [map] a map of input options for the operation
110+
* @callback callback function(err, data)
111+
* If a callback is supplied, it is called when a response is returned
112+
* from the service.
113+
* @param err [Error] the error object returned from the request.
114+
* Set to `null` if the request is successful.
115+
* @param data [Object] the de-serialized data returned from
116+
* the request. Set to `null` if a request error occurs.
117+
*/
118+
makeRequest: function makeRequest(operation, params, callback) {
119+
if (typeof params === 'function') {
120+
callback = params;
121+
params = null;
122+
}
123+
124+
var request = new TableStore.Request(this.config, operation, params);
125+
this.addAllRequestListeners(request);
126+
127+
if (callback) request.send(callback);
128+
return request;
129+
},
130+
131+
/**
132+
* @api private
133+
*/
134+
addAllRequestListeners: function addAllRequestListeners(request) {
135+
var list = [TableStore.events, TableStore.EventListeners.Core];
136+
for (var i = 0; i < list.length; i++) {
137+
if (list[i]) request.addListeners(list[i]);
138+
}
139+
140+
if (this.config.logger) { // add logging events
141+
request.addListeners(TableStore.EventListeners.Logger);
142+
}
143+
144+
this.setupRequestListeners(request);
145+
},
146+
147+
/**
148+
* How many times a failed request should be retried before giving up.
149+
* the defaultRetryCount can be overriden by service classes.
150+
*
151+
* @api private
152+
*/
153+
numRetries: function numRetries() {
154+
if (this.config.maxRetries !== undefined) {
155+
return this.config.maxRetries;
156+
} else {
157+
return this.defaultRetryCount;
158+
}
159+
},
160+
161+
/**
162+
* @api private
163+
*/
164+
retryDelays: function retryDelays() {
165+
var retryCount = this.numRetries();
166+
var delays = [];
167+
for (var i = 0; i < retryCount; ++i) {
168+
delays[i] = Math.pow(2, i) * 30;
169+
}
170+
return delays;
171+
},
172+
173+
/**
174+
* @api private
175+
*/
176+
retryableError: function retryableError(error) {
177+
if (this.networkingError(error)) return true;
178+
if (this.throttledError(error)) return true;
179+
if (error.statusCode >= 500) return true;
180+
return false;
181+
},
182+
183+
/**
184+
* @api private
185+
*/
186+
networkingError: function networkingError(error) {
187+
return error.code == 'NetworkingError';
188+
},
189+
190+
/**
191+
* @api private
192+
*/
193+
throttledError: function throttledError(error) {
194+
// this logic varies between services
195+
return (error.code == 'ProvisionedThroughputExceededException');
196+
},
197+
198+
/********************************** 表操作 开始 ******************************************/
199+
/**
200+
* 根据给定的表结构信息创建相应的表。
201+
*/
202+
createTable(params, callback) {
203+
return this.makeRequest('createTable', params, callback);
204+
},
205+
206+
/**
207+
* 获取当前实例下已创建的所有表的表名。
208+
*/
209+
listTable(params, callback) {
210+
return this.makeRequest('listTable', params, callback);
211+
},
212+
213+
/**
214+
* 删除本实例下指定的表。
215+
*/
216+
deleteTable(params, callback) {
217+
return this.makeRequest('deleteTable', params, callback);
218+
},
219+
220+
/**
221+
* 更新指定表的预留读吞吐量或预留写吞吐量设置。
222+
*/
223+
updateTable(params, callback) {
224+
return this.makeRequest('updateTable', params, callback);
225+
},
226+
227+
/**
228+
* 查询指定表的结构信息和预留读/写吞吐量设置信息。
229+
*/
230+
describeTable(params, callback) {
231+
return this.makeRequest('describeTable', params, callback);
232+
},
233+
234+
/********************************** 表操作 结束 ******************************************/
235+
236+
237+
/********************************** 数据操作 开始 ******************************************/
238+
239+
/**
240+
* 根据给定的主键读取单行数据。
241+
*/
242+
getRow(params, callback) {
243+
return this.makeRequest('getRow', params, callback);
244+
},
245+
246+
/**
247+
* 插入数据到指定的行,如果该行不存在,则新增一行;若该行存在,则覆盖原有行。
248+
*/
249+
putRow(params, callback) {
250+
return this.makeRequest('putRow', params, callback);
251+
},
252+
253+
/**
254+
* 更新指定行的数据。如果该行不存在,则新增一行;若该行存在,则根据请求的内容在这一行中新增、修改或者删除指定列的值。
255+
*/
256+
updateRow(params, callback) {
257+
return this.makeRequest('updateRow', params, callback);
258+
},
259+
260+
/**
261+
* 删除一行数据。
262+
*/
263+
deleteRow(params, callback) {
264+
return this.makeRequest('deleteRow', params, callback);
265+
},
266+
267+
/**
268+
* 读取指定主键范围内的数据。
269+
*/
270+
getRange(params, callback) {
271+
return this.makeRequest('getRange', params, callback);
272+
},
273+
274+
/**
275+
* 批量读取一个或多个表中的若干行数据。
276+
*/
277+
batchGetRow(params, callback) {
278+
return this.makeRequest('batchGetRow', params, callback);
279+
},
280+
281+
/**
282+
* 批量修改行
283+
*/
284+
batchWriteRow(params, callback) {
285+
return this.makeRequest('batchWriteRow', params, callback);
286+
}
287+
288+
/********************************** 数据操作 结束 ******************************************/
289+
});

lib/config.js

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
var TableStore = require('./core');
2+
3+
TableStore.Config = TableStore.util.inherit({
4+
5+
constructor: function Config(options) {
6+
if (options === undefined) options = {};
7+
8+
TableStore.util.each.call(this, this.keys, function (key, value) {
9+
this.set(key, options[key], value);
10+
});
11+
},
12+
13+
clear: function clear() {
14+
/*jshint forin:false */
15+
TableStore.util.each.call(this, this.keys, function (key) {
16+
delete this[key];
17+
});
18+
19+
// reset credential provider
20+
this.set('credentials', undefined);
21+
this.set('credentialProvider', undefined);
22+
},
23+
24+
getCredentials: function getCredentials() {
25+
return {
26+
accessKeyId: this.accessKeyId,
27+
secretAccessKey: this.secretAccessKey,
28+
securityToken: this.securityToken
29+
};
30+
},
31+
32+
/**
33+
* Sets a property on the configuration object, allowing for a
34+
* default value
35+
* @api private
36+
*/
37+
set: function set(property, value, defaultValue) {
38+
if (value === undefined) {
39+
if (defaultValue === undefined) {
40+
defaultValue = this.keys[property];
41+
}
42+
if (typeof defaultValue === 'function') {
43+
this[property] = defaultValue.call(this);
44+
} else {
45+
this[property] = defaultValue;
46+
}
47+
} else {
48+
this[property] = value;
49+
}
50+
},
51+
52+
keys: {
53+
accessKeyId: null,
54+
secretAccessKey: null,
55+
region: null,
56+
logger: null,
57+
endpoint: undefined,
58+
httpOptions: {},//timeout
59+
maxRetries: undefined,
60+
instancename: undefined,
61+
computeChecksums: true,
62+
}
63+
});

lib/core.js

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* The main TableStore namespace
3+
*/
4+
var TableStore = {};
5+
module.exports = TableStore;
6+
require('./util');
7+
require('./metadata');
8+
require('./long');
9+
require('./protocol/plain_buffer_consts');
10+
require('./protocol/plain_buffer_crc8');
11+
require('./protocol/plain_buffer_stream');
12+
require('./protocol/plain_buffer_coded_stream');
13+
require('./protocol/plian_buffer_builder');
14+
require('./filter');
15+
require('./protocol/encoder');
16+
require('./protocol/decoder');
17+
require('./metadata');
18+
require('./config');
19+
require('./http');
20+
require('./sequential_executor');
21+
require('./event_listeners');
22+
require('./request');
23+
require('./signer');
24+
TableStore.events = new TableStore.SequentialExecutor();
25+
require('./http/node');
26+
require('./client');

0 commit comments

Comments
 (0)