如何使用node-libcurl实现Digest认证的POST请求并解决报错
使用node-libcurl实现Digest认证并解决TypeError报错
问题描述
在Ubuntu终端测试需Digest认证的接口时,使用的curl命令如下:
curl --digest -u username:pass --location --request POST 'http://url' \ --header 'Content-Type: application/json'
改用node-libcurl库在Node.js中实现时,编写了以下代码但运行报错:
const { curly } = require('node-libcurl') exports.test = async () => { var user = 'user'; var pass = '45213'; var auth = new Buffer.alloc(user + ':' + pass).toString('base64'); const { data } = await curly.post('http://url', { postFields: JSON.stringify({ field: 'value' }), httpHeader: [ 'Content-Type: application/json', 'Accept: application/json', `Authorization: Basic + ${auth}` ], }) console.log(data); };
报错信息:
TypeError [ERR_INVALID_ARG_TYPE]: The "size" argument must be of type number.
解决方法
1. 修复TypeError报错
报错根源是Buffer.alloc()用法错误:该方法第一个参数要求传入数字类型的内存大小,但你传入了字符串user + ':' + pass。如果要将字符串转换为base64,应使用Buffer.from()方法。同时你拼接Authorization头的语法有误,多余了空格和加号,正确写法如下(仅作语法修正,这是Basic认证的写法,并非你需要的Digest认证):
var auth = Buffer.from(`${user}:${pass}`).toString('base64'); // 对应Header写法 `Authorization: Basic ${auth}`
2. 正确实现Digest认证
node-libcurl的curly模块内置支持Digest认证,无需手动构造Authorization头,只需配置两个参数即可对应curl的--digest和-u选项:
httpAuth: CurlAuth.DIGEST:指定使用Digest认证方式userpwd:${user}:${pass}``:传入用户名和密码组合
完整修正代码:
const { curly, CurlAuth } = require('node-libcurl') exports.test = async () => { const user = 'user'; const pass = '45213'; try { const { data } = await curly.post('http://url', { postFields: JSON.stringify({ field: 'value' }), httpHeader: [ 'Content-Type: application/json', 'Accept: application/json' ], // 配置Digest认证 httpAuth: CurlAuth.DIGEST, userpwd: `${user}:${pass}` }) console.log(data); } catch (error) { console.error('请求失败:', error); } };
额外说明
- node-libcurl会自动处理Digest认证的握手流程,和curl命令
--digest的行为完全一致,无需手动干预认证头 - 添加
try/catch可以更清晰地捕获请求过程中的各类错误,便于调试 - 建议使用最新版node-libcurl,避免版本兼容问题
内容的提问来源于stack exchange,提问作者jhon estrada
相关产品推荐
相关产品推荐

