Nginx njs中js_set无法赋值变量问题求助
解决方案
1. 问题根源分析
报错提示JSON解析时位置0存在意外字符,核心原因是r.requestText为空或未被正确读取——即便你确认请求体是合法JSON,Nginx+njs在执行js_set的阶段,请求体可能还未完全加载,导致解析失败。
2. 修正方案
方法一:通过请求事件确保请求体加载完成
修改njs脚本,利用request事件等待请求体加载完成后再解析,同时添加错误捕获:
function extract(r) { r.on('request', function(data, flags) { try { var json = JSON.parse(data); r.variables.sessionid = json.sessionId || ''; } catch (e) { r.error('JSON解析失败: ' + e.message); r.variables.sessionid = ''; } }); }
对应的Nginx配置调整:
js_import http from /etc/nginx/njs/http.js; js_set $sessionid http.extract; server { # 其他基础配置... location / { # 配置缓冲区避免请求体写入磁盘,加快读取速度 client_body_buffer_size 16k; proxy_set_header Cookie "mycookie=$sessionid"; proxy_pass http://your-upstream-server; } }
方法二:直接读取请求体并添加校验逻辑
如果坚持使用js_set的方式,需添加请求体存在性校验和错误捕获:
function extract(r) { try { if (!r.requestText) return ''; var json = JSON.parse(r.requestText); return json.sessionId || ''; } catch (e) { r.error('提取sessionId失败: ' + e.message); return ''; } }
Nginx配置中强制请求体存入内存缓冲区:
js_set $sessionid http.extract; server { # 其他基础配置... location / { client_body_in_single_buffer on; proxy_set_header Cookie "mycookie=$sessionid"; proxy_pass http://your-upstream-server; } }
3. 验证请求正确性
确保curl请求正确发送JSON请求体并设置Content-Type:
curl -X POST -H "Content-Type: application/json" -d '{ "sessionId":"F105" }' http://your-nginx-address
4. 日志排查辅助
若问题仍存在,可在njs函数中添加日志输出,确认r.requestText的实际内容:
function extract(r) { r.error('当前requestText内容: ' + r.requestText); try { var json = JSON.parse(r.requestText); return json.sessionId || ''; } catch (e) { r.error('解析错误详情: ' + e.message); return ''; } }
查看/var/log/nginx/error.log即可确认请求体是否符合预期。
内容的提问来源于stack exchange,提问作者Fergara
相关产品推荐
相关产品推荐

