You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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错误。

修复步骤

直接调整这两处地方就行:

  1. 移除querystring.stringify()的调用,直接把原始的api_form对象传给api_call_with_data函数,让json: true帮你处理序列化。
  2. 可以删掉手动设置的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:29:08