使用image-type校验图片链接报预期Uint8Array/Buffer却得object错误如何解决
问题原因
- 调用
response.read(imageType.minimumBytes)时,若响应流当前可用字节数小于要求的最小字节数,方法会返回null。null的类型判定结果为object,刚好匹配报错中提到的输入类型不符合的问题。 - 现有代码缺失响应状态校验逻辑,若链接返回4xx/5xx错误,响应体并非图片二进制内容,也会导致读取结果不符合
image-type的输入要求。
修复方案
补充字节有效性判断、请求异常处理、响应状态校验逻辑即可解决问题,修改后参考代码如下:
const https = require("https"); const imageType = require("image-type"); const imageModel = require("../models/models.js"); const date = new Date(); const currentDate = date.toLocaleDateString(); const submitLink = async (req, res) => { const { url } = req.body; https.get(url, (response) => { // 校验响应状态码,非成功状态直接终止请求 if (response.statusCode < 200 || response.statusCode >= 300) { response.destroy(); return res.status(400).send('图片链接无法正常访问'); } const receivedChunks = []; response.on('data', (chunk) => { receivedChunks.push(chunk); const combinedBuffer = Buffer.concat(receivedChunks); // 攒够格式判断需要的最小字节后即可终止读取,减少性能消耗 if (combinedBuffer.length >= imageType.minimumBytes) { response.destroy(); const imageInfo = imageType(combinedBuffer); // 校验图片格式是否为允许的jpg/png if (!imageInfo || !['jpg', 'png'].includes(imageInfo.ext)) { return res.status(400).send('仅支持上传jpg、png格式的图片'); } // 格式校验通过,后续写入数据库、存储资源的逻辑可在此处实现 console.log('图片格式校验通过', imageInfo); } }); // 处理响应流读取错误 response.on('error', () => { res.status(500).send('读取图片资源失败'); }); // 处理请求发送阶段的错误,比如链接域名不存在 }).on('error', () => { res.status(400).send('提交的图片链接无效'); }); };
内容的提问来源于stack exchange,提问作者tanjim anim
相关产品推荐
相关产品推荐

