You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 23:43:11