使用npm-registry-client发布包出现ERR_INVALID_ARG_TYPE错误如何解决
错误原因
npm-registry-client的fetch方法默认会自动解析响应内容,拉取tarball二进制流时如果没有显式指定响应编码,返回的data会被解析为字符数组,而非要求的二进制Buffer对象。- 发布包时底层需要对包内容做哈希校验,调用
Hash.update方法时仅支持字符串、Buffer、TypedArray等类型,传入数组会直接抛出类型不匹配错误。
解决方法
- 调整
fetch方法的请求参数,显式添加encoding: null配置,强制返回原生二进制Buffer:
拉取tarball时,在原请求参数from.params中新增encoding: null,避免二进制内容被错误解析为数组。 - 修正
publish方法的回调函数写法,原代码中直接写process(error, data, raw, res) {}会触发未定义错误,替换为合法的回调函数声明。
修改后参考代码:
new Promise((resolve, reject) => { // 合并参数,新增encoding: null强制返回Buffer类型 const fetchOpts = Object.assign({}, from.params, { encoding: null }) client.fetch(dist.tarball, fetchOpts, function (error, data, raw, res) { if (error) { return reject(error); } resolve(data); }); }) .then(tarball => { return new Promise((resolve, reject) => { const publishParams = { metadata: newMetadata, access: "public", body: tarball, // 此时tarball为Buffer类型,符合哈希计算要求 auth: to.params.auth } // 修正回调函数写法 npm.publish(`${to.feedUrl}/${moduleName}`, publishParams, function(error, data, raw, res) { if (error) { return reject(error) } resolve(data) }); }) })
内容的提问来源于stack exchange,提问作者char
相关产品推荐
相关产品推荐

