Node.js调用外部API失败求助:附代码及报错信息
Node.js调用外部API时的加密解密错误修复方案
嘿,我看你用request模块调用外部API时碰到了那个头疼的加密错误,我帮你捋捋问题出在哪,怎么修复。
首先,咱们先揪出你代码里的矛盾点:
- 你设置了
json: true,这个选项会让request自动把body里的对象序列化成JSON字符串,同时自动设置Content-Type: application/json请求头。 - 但你又用
querystring.stringify()把表单对象转成了URL编码的字符串(比如first_name=Stack&last_name=Overflow...),然后把这个字符串传给了body。
这就导致request把这个URL编码的字符串再转成了JSON格式的字符串(相当于把一串文本套成了JSON字符串),后端接收到的根本不是它期望的JSON对象,而是一个奇怪的文本,后端在解密处理请求体的时候自然就报错了,也就是你看到的ERR_OSSL_EVP_WRONG_FINAL_BLOCK_LENGTH错误。
修复步骤
直接调整这两处地方就行:
- 移除
querystring.stringify()的调用,直接把原始的api_form对象传给api_call_with_data函数,让json: true帮你处理序列化。 - 可以删掉手动设置的
headers里的content-type,因为json: true会自动帮你设置正确的请求头,避免冲突。
修改后的完整代码如下:
var request = require('request'); // 不需要querystring模块了,可以删掉 // var querystring = require('querystring'); // 修正函数定义的语法错误(原代码里function赋值多了个=) function api_call_with_data(url, form_data) { return new Promise((resolve, reject) => { request.post({ uri: url, // 删掉手动设置的content-type,让json:true自动处理 // headers: { "content-type": "application/json" }, body: form_data, method: 'POST', json: true }, (err, res, final_res) => { if (err) reject(err); resolve(final_res); }); }) }; app.get('/call_api', (req, res) => { var api_url = "http://www.example.com/api/test"; var api_form = { "first_name": "Stack", "last_name": "Overflow", "email_id": "test@example.com" }; // 直接传api_form,不用转成querystring api_call_with_data(api_url, api_form) .then(response => { res.send(response); }) .catch(error => { res.send(error) }) });
另外提一句,request模块已经被官方标记为弃用了,后续如果要维护项目的话,推荐换成axios或者node-fetch这些还在持续维护的HTTP库,避免后续碰到更多兼容性问题。
内容的提问来源于stack exchange,提问作者Purvesh Bhavsar
相关产品推荐
相关产品推荐

