Nginx下Node.js客户端对外请求异常排查及流程咨询
问题解答
1. Nginx处理对外请求的流程
- 收到外部请求后,首先通过
server_name匹配对应的虚拟主机配置 - 接着根据请求的URI、HTTP方法,匹配配置中的
location块规则 - 若
location配置了反向代理(如proxy_pass),则将请求转发至指定后端服务;若为静态资源请求,则直接读取并返回对应文件 - 在转发/返回前,执行配置中的各类预处理指令(如修改请求头、设置缓存策略、限流等)
- 收到后端服务响应后,执行响应处理(如修改响应头、压缩内容),最终将结果返回给请求发起方
2. curl正常但Node.js请求失败的原因
你的判断是对的:终端curl请求确实不经过Server A的本地Nginx,它直接从终端所在环境发起请求到Server B;而Node.js请求是从Server A的Node服务进程发起的,但这不是400错误的核心原因,问题出在你的Node.js代码本身:
核心问题1:未发送请求体
curl通过--data参数将JSON数据传递给了Server B,但你的Node.js代码中,虽然将数据转为了datastr,但没有通过请求对象发送该数据。https.request的配置项里不存在body参数,必须通过req.write()将数据写入请求,再调用req.end()结束请求:
// 替换原有的req.end(); if (datastr) { req.write(datastr); } req.end();
核心问题2:代码存在语法错误
处理header的if语句后多了一个多余的大括号,会导致代码执行异常:
if (header !== undefined) { options['headers'] = header }; // 此处多余的}会破坏代码结构 }
其他潜在问题
options中的secure: false是无效配置,https.request不支持该参数- 同时设置
rejectUnauthorized: false和process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0属于重复操作,推荐仅保留前者(避免全局禁用TLS证书校验)
修正后的关键代码片段
const req = https.request(options, (res) => { console.log('status code ', res.statusCode); console.log('headers:', res.headers); res.on('data', (d) => { process.stdout.write(d); console.log(d); if(res.statusCode === "errorexample"){ callback(null, {data : "success"}) }else{ let errormsg = { message : res.message, statusCode : res.statusCode, failureAlarmCode : res.failureAlarmCode } callback(null, { "error": errormsg }); } }); }); req.on('error', (e) => { console.error(e); callback(e, null); }); // 写入请求体并结束请求 if (datastr) { req.write(datastr); } req.end();
内容的提问来源于stack exchange,提问作者Saheel Sapovadia
相关产品推荐
相关产品推荐

