执行executeNewOrder函数触发ERR_INVALID_ARG_TYPE错误,求签名排查
解决ERR_INVALID_ARG_TYPE签名生成错误
错误信息
问题根源
代码中签名生成的链式调用逻辑完全错误:错误地将digest("hex")挂在了URLSearchParams.toString()的结果后面,导致update()方法接收到的不是待签名的字符串,而是尝试对字符串调用不存在的digest方法,直接触发类型错误。
另外还有两处细节问题:
- 请求头里的
X-MBX-APIKEY字段前有多余空格,会导致身份验证失败 - POST请求的参数拼接方式不符合多数加密货币交易所规范(通常应放在请求体而非URL查询参数)
修正后的代码
import axios from "axios"; import crypto from "crypto"; const apiKey = process.env.API_KEY; const apiSecret = process.env.API_SECRET; const apiUrl = process.env.API_URL; export async function executeNewOrder(symbol, quantity, side, price) { const data = { symbol, quantity, side, price, type: "LIMIT", timeInForce: "GTC", timestamp: Date.now(), // 多数交易所字段名为小写s的timestamp recvWindow: 50000, }; // 正确生成签名:先拼接参数字符串,再执行HMAC加密并转十六进制 const queryString = new URLSearchParams(data).toString(); const signature = crypto .createHmac("sha256", apiSecret) .update(queryString) .digest("hex"); // 将签名加入请求参数 const requestData = new URLSearchParams({ ...data, signature, }); const result = await axios({ method: "POST", url: `${apiUrl}/v3/order`, headers: { "X-MBX-APIKEY": apiKey, // 移除多余空格 "Content-Type": "application/x-www-form-urlencoded", }, data: requestData, // POST参数放在请求体中 }); return result; }
关键修改点
- 调整签名生成的链式调用顺序,确保
update()接收纯字符串,digest()在HMAC实例上调用 - 修正时间戳字段名为
timestamp(匹配多数交易所的参数要求) - 将POST参数移至请求体,并设置正确的
Content-Type - 移除请求头字段的多余空格
内容的提问来源于stack exchange,提问作者Lucas de Castro Patrão
相关产品推荐
相关产品推荐

