使用Axios调用Streamsb API时遇请求错误求助
排查Streamsb文件上传API的Axios调用问题
第一个错误:getaddrinfo ENOTFOUND ssuploader.streamsb.com
这个错误是因为硬编码的上传域名ssuploader.streamsb.com不存在或无法被DNS解析,你后续改成通过https://api.streamsb.com/api/upload/server获取动态上传服务器的思路是正确的——Streamsb的上传节点是动态分配的,不能直接固定域名。
第二个错误:AxiosError: Request failed with status code 400
400错误是请求格式不符合API要求,你的代码存在几个关键问题,修正方案如下:
1. 移除错误的Content-Type设置
你保留了之前的axiosConfig,手动设置了application/x-www-form-urlencoded,但使用FormData上传文件时,请求头应该是multipart/form-data(且需要自动生成的boundary分隔符)。手动覆盖头会导致服务器无法解析表单数据,直接删除这个配置即可,Axios会自动根据FormData生成正确的请求头。
2. Node.js环境下正确使用FormData
Node.js没有原生浏览器的FormData对象,需要先执行npm install form-data安装第三方包,再在代码中引入使用。
3. 文件上传需指定文件名
向FormData添加文件时,必须明确指定文件名,帮助服务器识别文件类型,否则会被判定为无效请求。
修正后的完整代码
const axios = require('axios'); const fs = require('fs'); const FormData = require('form-data'); // 引入form-data包 const API_KEY = '你的API密钥'; const file = __dirname + "/video/Video.mp4"; const fileStream = fs.createReadStream(file); // 构建FormData const formData = new FormData(); formData.append('api_key', API_KEY); formData.append('file', fileStream, 'Video.mp4'); // 指定文件名参数 // 先获取上传服务器地址 axios.get(`https://api.streamsb.com/api/upload/server?key=${API_KEY}`) .then(result => { const uploadUrl = result.data.result; // 发送上传请求,无需手动设置Content-Type,Axios会自动处理 return axios.post(uploadUrl, formData, { headers: formData.getHeaders() // 可选:用form-data的方法获取标准头,避免自动处理异常 }); }) .then(uploadResult => { console.log('上传结果:', uploadResult.data); }) .catch(err => { // 打印更详细的错误信息,方便排查 console.error('错误详情:', err.response?.data || err.message); });
额外排查点
- 确认
API_KEY的正确性,密钥错误也会返回400 - 检查文件路径是否正确,确保
fs.createReadStream能正常读取文件 - 打印
result.data.result确认获取到的上传地址是完整有效的URL(格式类似https://xxx.streamsb.com/upload/xx)
内容的提问来源于stack exchange,提问作者Tac Revol
相关产品推荐
相关产品推荐

