【发布时间】:2018-10-24 15:08:26
【问题描述】:
我真的很难理解 js 的行为。
var rp = require('request-promise');
var crypto = require('crypto');
var options = {
method : 'GET',
uri : "https://api.binance.com/api/v1/order",
qs: {
signature : hash,
timestamp : Date.now(),
symbol : 'LTCBTC'
},
headers: {
'X-MBX-APIKEY' : 'PUBLICKEY'
},
json : true
};
var hash= crypto.createHmac('sha256', options.toString())
.update('SECRETKEY')
.digest('hex');
//console.log(hash);
rp(options)
.then(function (Bbody) {
console.log(Bbody);
})
.catch(function (err) {
console.log(err);
});
如果我将hash 函数放在options 之前
它说(显然)
TypeError: 无法读取未定义的属性“toString”
但是如果我把它放在我共享的代码中,我会得到这个错误:
StatusCodeError: 400 - {"code":-1102,"msg":"强制参数 'signature' 未发送,为空/null,或格式错误。"}
这是请求的输出:
options:
{ method: 'GET',
uri: 'https://api.binance.com/api/v1/order',
qs:
{ signature: undefined,
timestamp: 1540392736646,
symbol: 'LTCBTC' },
headers:
{ 'X-MBX-APIKEY':
'PUBLICKEY' },
json: true,
callback: [Function: RP$callback],
transform: undefined,
simple: true,
resolveWithFullResponse: false,
transform2xxOnly: false },
如果我取消注释console.log(),我会在请求拒绝之前在视频上打印正确的哈希值作为第一个输出。电话仍然无法接听。
我已用作文档:
this node documentation for the crypto library
and this npm doc to promisify api calls
附: :PUBLICKEY 和 SECRETKEY 是占位符,但在我的测试中我使用了正确的字符串。
【问题讨论】:
-
你缺少一个键,函数调用是
crypto.createHmac(algorithm, key[, options])你还需要一个键,options 是可选参数并且执行options.toString()不会返回一个字符串值。您现在想通过简单地添加一个附加参数来更正您的代码var hash= crypto.createHmac('sha256', 'secretkeytoken', options)
标签: javascript node.js encryption es6-promise