diff --git a/lib/Api.js b/lib/Api.js index 233e012..516f767 100644 --- a/lib/Api.js +++ b/lib/Api.js @@ -4,16 +4,15 @@ var Promise = require('bluebird'); var util = require('./util'); var config = require('./config'); var Request = require('./Request'); +var YhsdParamError = require('./Error').YhsdParamError; var reqCountMap = {}; -paramError = new Error('缺少参数'); -promiseError = new Error('`getRequestCount`和`saveRequestCount`必须是 function'); function check(option) { if (option && (option.getRequestCount || option.saveRequestCount) && (!util.isFunction(option.getRequestCount) || !util.isFunction(option.saveRequestCount))) { - throw promiseError; + throw new YhsdParamError('option.getRequestCount 和 option.saveRequestCount 必须是函数!');; } } @@ -65,7 +64,7 @@ var reqCountWrap = function (token, fn) { */ var Api = function (token, option) { if (arguments.length < 1) { - throw paramError; + throw new YhsdParamError(['token', 'option']); } check(option); @@ -91,7 +90,7 @@ Api.prototype = { */ get: function (path, query) { if (arguments.length < 1) { - throw paramError; + throw new YhsdParamError(['path', 'query']); } return this.request('GET', query ? path + '?' + querystring.stringify(query) : path, null); }, @@ -103,7 +102,7 @@ Api.prototype = { */ put: function (path, data) { if (arguments.length < 2) { - throw paramError; + throw new YhsdParamError(['path', 'data']); } return this.request('PUT', path, data); }, @@ -115,7 +114,7 @@ Api.prototype = { */ post: function (path, data) { if (arguments.length < 2) { - throw paramError; + throw new YhsdParamError(['path', 'data']); } return this.request('POST', path, data); }, @@ -126,7 +125,7 @@ Api.prototype = { */ delete: function (path) { if (arguments.length < 1) { - throw paramError; + throw new YhsdParamError(['path']); } return this.request('DELETE', path, null); }, diff --git a/lib/Auth.js b/lib/Auth.js index 9e2e119..f2be7f7 100644 --- a/lib/Auth.js +++ b/lib/Auth.js @@ -2,8 +2,9 @@ var querystring = require('querystring'); var crypto = require('crypto'); var config = require('./config'); var Request = require('./Request'); +var YhsdError = require('./Error').YhsdError; +var YhsdParamError = require('./Error').YhsdParamError; var timeOffset = 1000 * 60 * 10; -var paramError = new Error('缺少参数'); /** * 构造函数 @@ -20,11 +21,11 @@ var paramError = new Error('缺少参数'); */ var Auth = function (options) { if (arguments.length < 1 || !options.appKey || !options.appSecret) { - throw paramError; + throw new YhsdParamError(['options.appKey', 'options.appSecret']); } if (!options.private) { if (!options.callbackUrl) { - throw paramError; + throw new YhsdParamError(['options.callbackUrl']); } options.scope || (options.scope = ['read_basic']); } @@ -50,7 +51,7 @@ Auth.prototype = { */ verifyHmac: function (queryObj) { if (arguments.length < 1) { - throw paramError; + throw new YhsdParamError(['query.hmac', 'query.time_stamp']); } var hmac = queryObj.hmac; delete queryObj.hmac; @@ -67,7 +68,7 @@ Auth.prototype = { */ getAuthorizeUrl: function (shopKey, state) { if (arguments.length < 1) { - throw paramError; + throw new YhsdParamError(['shopKey', 'state']); } return this.protocol + '://' + this.host + '/oauth2/authorize?' + querystring.stringify({ response_type: 'code', @@ -95,7 +96,7 @@ Auth.prototype = { }; } else { if (arguments.length < 1) { - throw paramError; + throw new YhsdParamError(['code']); } params = { grant_type: 'authorization_code', @@ -112,8 +113,15 @@ Auth.prototype = { headers: headers }; return this._request.request(option, params).then(function (data) { - if (!data.token.length) { - throw new Error('无效的 token'); + if (!data || !data.token) { + switch ((data || {}).error) { + case 'invalid_grant': + throw new YhsdError('未授权, 请检查 appKey, appSecret!'); + case 'invalid_client': + throw new YhsdError('无效客户端, 请检查 appKey, appSecret!'); + default: + throw new YhsdError('获取 token 失败!'); + } } return data.token; }); diff --git a/lib/Error.js b/lib/Error.js new file mode 100644 index 0000000..c2cb57b --- /dev/null +++ b/lib/Error.js @@ -0,0 +1,27 @@ +var util = require('./util') + +function YhsdError(message) { + var e = new Error() + e.name = this.name = 'YhsdError'; + this.message = message || ''; + this.stack = (e).stack; +} +YhsdError.prototype = Object.create(Error.prototype); +YhsdError.prototype.constructor = YhsdError; + +module.exports.YhsdError = YhsdError + +function YhsdParamError() { + var message = '参数异常'; + if (util.isString(arguments[0])) message = '参数异常: ' + arguments.join(';'); + if (util.isArray(arguments[0])) message = '缺少参数: ' + arguments[0].join(','); + + var e = new Error() + e.name = this.name = 'YhsdParamError'; + this.message = message; + this.stack = (e).stack; +} +YhsdParamError.prototype = Object.create(Error.prototype); +YhsdParamError.prototype.constructor = YhsdParamError; + +module.exports.YhsdParamError = YhsdParamError \ No newline at end of file diff --git a/lib/WebHook.js b/lib/WebHook.js index 3eeb189..05f6461 100644 --- a/lib/WebHook.js +++ b/lib/WebHook.js @@ -1,13 +1,14 @@ -var paramError = new Error('缺少参数'); var crypto = require('crypto'); +var YhsdParamError = require('./Error').YhsdParamError; + /** * 初始化 * @param {string} webHookToken */ var WebHook = function(webHookToken) { if (arguments.length < 1) { - throw paramError; + throw new YhsdParamError(['webHookToken']); } this.token = webHookToken; }; @@ -21,7 +22,7 @@ WebHook.prototype = { */ verifyHmac: function(hmac, bodyData) { if (arguments.length < 2) { - throw paramError; + throw new YhsdParamError(['hmac', 'bodyData']); } var calculatedHmac = crypto.createHmac('sha256', this.token).update(bodyData, 'utf8').digest('base64'); return hmac === calculatedHmac; diff --git a/lib/util.js b/lib/util.js index 13b37ca..9a19a7e 100644 --- a/lib/util.js +++ b/lib/util.js @@ -2,6 +2,12 @@ module.exports = { isPromise: function (object) { return object && this.isObject(object) && this.isFunction(object.then); }, + isString: function (string) { + return typeof string === 'string'; + }, + isArray: function (array) { + return typeof array === 'object' && array instanceof Array; + }, isObject: function (object) { return typeof object === 'object'; }, diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..c7d3d1f --- /dev/null +++ b/package-lock.json @@ -0,0 +1,553 @@ +{ + "name": "yhsd-api", + "version": "2.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.9.tgz", + "integrity": "sha1-kbR5JYinc4wl813W9jdSovh3YTU=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true, + "optional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "diff": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-1.4.0.tgz", + "integrity": "sha1-fyjS657nsVqX79ic5j3P2qPMur8=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.2.tgz", + "integrity": "sha1-Tbwv5nTnGUnK8/smlc5/LcHZqNE=", + "dev": true + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=", + "dev": true, + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "handlebars": { + "version": "4.7.6", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.6.tgz", + "integrity": "sha512-1f2BACcBfiwAfStCKZNrUCgqNZkGsAT7UM3kkYtXuLo0KnaVfjKOyf7PRzB6++aK9STyT1Pd2ZCPe3EGOXleXA==", + "dev": true, + "requires": { + "minimist": "^1.2.5", + "neo-async": "^2.6.0", + "source-map": "^0.6.1", + "uglify-js": "^3.1.4", + "wordwrap": "^1.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "istanbul": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/istanbul/-/istanbul-0.4.5.tgz", + "integrity": "sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=", + "dev": true, + "requires": { + "abbrev": "1.0.x", + "async": "1.x", + "escodegen": "1.8.x", + "esprima": "2.7.x", + "glob": "^5.0.15", + "handlebars": "^4.0.1", + "js-yaml": "3.x", + "mkdirp": "0.5.x", + "nopt": "3.x", + "once": "1.x", + "resolve": "1.1.x", + "supports-color": "^3.1.0", + "which": "^1.1.1", + "wordwrap": "^1.0.0" + } + }, + "jade": { + "version": "0.26.3", + "resolved": "https://registry.npmjs.org/jade/-/jade-0.26.3.tgz", + "integrity": "sha1-jxDXl32NefL2/4YqgbBRPMslaGw=", + "dev": true, + "requires": { + "commander": "0.6.1", + "mkdirp": "0.3.0" + }, + "dependencies": { + "commander": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-0.6.1.tgz", + "integrity": "sha1-+mihT2qUXVTbvlDYzbMyDp47GgY=", + "dev": true + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=", + "dev": true + } + } + }, + "js-yaml": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz", + "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + } + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "dev": true + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "mocha": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-2.5.3.tgz", + "integrity": "sha1-FhvlvetJZ3HrmzV0UFC2IrWu/Fg=", + "dev": true, + "requires": { + "commander": "2.3.0", + "debug": "2.2.0", + "diff": "1.4.0", + "escape-string-regexp": "1.0.2", + "glob": "3.2.11", + "growl": "1.9.2", + "jade": "0.26.3", + "mkdirp": "0.5.1", + "supports-color": "1.2.0", + "to-iso-string": "0.0.2" + }, + "dependencies": { + "commander": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.3.0.tgz", + "integrity": "sha1-/UMOiJgy7DU7ms0d4hfBHLPu+HM=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2", + "minimatch": "0.3" + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "supports-color": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-1.2.0.tgz", + "integrity": "sha1-/x7R5hFp0Gs88tWI4YixjYhH4X4=", + "dev": true + } + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "should": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/should/-/should-8.4.0.tgz", + "integrity": "sha1-XmCInT5kS73Tl6MM00+tKPz5C8A=", + "dev": true, + "requires": { + "should-equal": "0.8.0", + "should-format": "0.3.2", + "should-type": "0.2.0" + } + }, + "should-equal": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-0.8.0.tgz", + "integrity": "sha1-o/BXMv9FusG3ukEvhAiFaBlkEpk=", + "dev": true, + "requires": { + "should-type": "0.2.0" + } + }, + "should-format": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-0.3.2.tgz", + "integrity": "sha1-pZgx4Bot3uFJkRvHFIvlyAMZ4f8=", + "dev": true, + "requires": { + "should-type": "0.2.0" + } + }, + "should-type": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-0.2.0.tgz", + "integrity": "sha1-ZwfvlVKdmJ3MCY/gdTqx+RNrt/Y=", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "source-map": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.2.0.tgz", + "integrity": "sha1-2rc/vPwrqBm03gO9b26qSBZLP50=", + "dev": true, + "optional": true, + "requires": { + "amdefine": ">=0.0.4" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "dev": true, + "requires": { + "has-flag": "^1.0.0" + } + }, + "to-iso-string": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/to-iso-string/-/to-iso-string-0.0.2.tgz", + "integrity": "sha1-TcGeZk38y+Jb2NtQiwDG2hWCVdE=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uglify-js": { + "version": "3.9.4", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.9.4.tgz", + "integrity": "sha512-8RZBJq5smLOa7KslsNsVcSH+KOXf1uDU8yqLeNuVKwmT0T3FA0ZoXlinQfRad7SDcbZZRZE4ov+2v71EnxNyCA==", + "dev": true, + "optional": true, + "requires": { + "commander": "~2.20.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 31b0f64..bc0313e 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "yhsd-api", - "version": "2.1.1", + "version": "2.1.2", "description": "Youhaosuda API SDK for node.", "main": "index.js", "repository": { diff --git a/test/api.test.js b/test/api.test.js index 3958a21..baf75d0 100644 --- a/test/api.test.js +++ b/test/api.test.js @@ -2,24 +2,25 @@ * Created by obzerg on 16/1/5. */ var should = require('should'); +var YhsdParamError = require('../lib/Error').YhsdParamError; var Yhsd = require('../index'); describe('test/api.test.js', function () { var api; before(function () { - api = new Yhsd.Api('5e242b4b41d14a2d8f4d80a9c6b05bea'); + api = new Yhsd.Api('44046fe73ce8494c8caed56d8b2ad3ad'); }); it('get api instance should throw error', function () { (function () { new Yhsd.Api(); - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); it('http get should be throw error', function () { (function () { api.get(); - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); it('http get should be success', function (done) { @@ -33,7 +34,7 @@ describe('test/api.test.js', function () { it('http put should be throw error', function () { (function () { api.put(); - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); it('http put should be success', function (done) { @@ -47,7 +48,7 @@ describe('test/api.test.js', function () { it('http post should be throw error', function () { (function () { api.post(); - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); it('http post should be success', function (done) { @@ -62,6 +63,7 @@ describe('test/api.test.js', function () { }; api.post('metas', obj).then(function (body) { should.exist(body); + var id = body.meta.id; api.delete('metas/' + id).then(function (body) { should.exist(body); @@ -73,7 +75,7 @@ describe('test/api.test.js', function () { it('http delete should be throw error', function () { (function () { api.delete(); - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); it('http delete should be success', function (done) { @@ -104,6 +106,7 @@ describe('test/api.test.js', function () { }); it('api should be throw ENOTFOUND error', function (done) { + this.timeout(10000) var api = new Yhsd.Api('5e242b4b41d14a2d8f4d80a9c6b05bea',{ host: 'localhost:32876', protocol: 'http' diff --git a/test/auth.test.js b/test/auth.test.js index 6c1e2e3..5570dfa 100644 --- a/test/auth.test.js +++ b/test/auth.test.js @@ -2,9 +2,10 @@ * Created by obzerg on 16/1/5. */ var should = require('should'); -var Yhsd = require('../index'); var crypto = require('crypto'); var querystring = require('querystring'); +var YhsdParamError = require('../lib/Error').YhsdParamError; +var Yhsd = require('../index'); describe('test/auth.test.js', function () { it('get auth instance should be fail', function () { @@ -12,7 +13,7 @@ describe('test/auth.test.js', function () { new Yhsd.Auth({ appKey: '548e29e46091449e949a8e1ffe4e4167' }) - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); //appKey和appSecret缺一不可 }); @@ -22,7 +23,7 @@ describe('test/auth.test.js', function () { appKey: '548e29e46091449e949a8e1ffe4e4167', appSecret: 'b9fec3d128064ea89f1e9b8324eeabc5' }) - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); //缺少callbackUrl }); @@ -33,7 +34,7 @@ describe('test/auth.test.js', function () { appSecret: 'b9fec3d128064ea89f1e9b8324eeabc5', callbackUrl: 'http://your.app.url' }).getToken() - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); //缺少参数 }); @@ -58,6 +59,7 @@ describe('test/auth.test.js', function () { }); auth.getToken().catch(function (err) { should.exist(err); + should.ok(err.message == '未授权, 请检查 appKey, appSecret!'); done(); }); //获取私有应用token @@ -71,6 +73,7 @@ describe('test/auth.test.js', function () { }); auth.getToken('your code').catch(function (err) { should.exist(err); + should.ok(err.message == '无效客户端, 请检查 appKey, appSecret!'); done(); }); //获取公有应用token应传入code @@ -83,7 +86,7 @@ describe('test/auth.test.js', function () { appSecret: 'b9fec3d128064ea89f1e9b8324eeabc5' + 'error', callbackUrl: 'http://your.app.url' }).getAuthorizeUrl() - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); //获取授权地址应传入appKey和参数中的state }); @@ -107,7 +110,7 @@ describe('test/auth.test.js', function () { appSecret: 'b9fec3d128064ea89f1e9b8324eeabc5' + 'error', callbackUrl: 'http://your.app.url' }).verifyHmac() - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); //验证hmac需传入参数json对象 diff --git a/test/request.test.js b/test/request.test.js index 9bec36e..1032669 100644 --- a/test/request.test.js +++ b/test/request.test.js @@ -45,10 +45,10 @@ describe('test/request.test.js', function () { }, }); it('should return ok', function (done) { + this.timeout(12000) var i = 0; function request() { - console.time('complete'); _request.request({ hostname: Yhsd.config.apiHost, path: '/v1/shop', @@ -58,10 +58,6 @@ describe('test/request.test.js', function () { 'X-API-ACCESS-TOKEN': token } }) - .then(function () { - // console.timeEnd('complete'); - // console.log(reqCountMap[token], i); - }) .then(function () { if (i < 200) { request(); diff --git a/test/webhook.test.js b/test/webhook.test.js index 736c5b0..f0dbb42 100644 --- a/test/webhook.test.js +++ b/test/webhook.test.js @@ -2,6 +2,7 @@ * Created by obzerg on 16/1/5. */ var should = require('should'); +var YhsdParamError = require('../lib/Error').YhsdParamError; var Yhsd = require('../index'); describe('test/webhook.test.js', function () { @@ -12,13 +13,13 @@ describe('test/webhook.test.js', function () { it('get webhook instance should be fail', function () { (function () { new Yhsd.WebHook() - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); it('verifyHmac should be throw error', function () { (function () { webHook.verifyHmac() - }).should.throw('缺少参数'); + }).should.throw(YhsdParamError); }); it('verifyHmac should be fail', function () {