为什么clinic.js配合Autocannon压测返回0个2xx响应、36164个非2xx响应
问题原因排查方向
缺失接口请求路径
你当前的autocannon命令仅指定了localhost:$PORT,未填写实际接口路径(如/api/your-endpoint),相当于直接请求服务根路径。Postman测试时你大概率填写了正确的接口路径,两者请求目标不一致自然返回错误。请求头格式错误
autocannon的请求头参数格式不符合要求,你当前写的-H "Authorization":"Bearer xxx"会导致头解析失败,正确写法应该是把整个头字段放在一对引号内,冒号后加空格:-H "Authorization: Bearer xxx"。头解析错误会导致服务端校验不通过,返回4xx状态码。缺失Content-Type请求头
你使用POST方式提交JSON格式的请求体,但未指定Content-Type: application/json头,服务端无法正确识别请求体格式,会直接返回400错误。Postman提交JSON请求时会自动携带该头,你没有手动配置也能正常请求。请求体文件读取失败
命令中-i my-data.json默认读取命令执行目录下的该文件,若文件不存在、路径错误或者JSON格式非法,autocannon会发送异常请求体,导致服务端校验失败。协议/端口不匹配
日志显示压测地址为http://localhost:443,443是HTTPS默认端口,如果你的服务开启了HTTPS,用HTTP协议请求会直接握手失败;另外要确认你的Node.js服务是否正确读取了clinic传递的$PORT环境变量监听端口,若代码写死了监听端口,会导致压测的端口和实际服务端口不一致。
快速验证方法
你可以先单独运行autocannon命令测试,替换实际端口、补充路径和正确参数,加上打印响应的参数即可直接看到错误类型:
autocannon http://localhost:你的服务端口/你的接口路径 --connections 5 -m "POST" -i ./my-data.json -H "Authorization: Bearer xxx" -H "Content-Type: application/json" -d 1 --printResponseBody
内容的提问来源于stack exchange,提问作者linker85

