JavaScript发送GET请求结果无法传入R Shiny的input$myinfo求助
解决Shiny中JavaScript传递数据到input$myinfo为空的问题
我帮你梳理几个可能导致input$myinfo始终为空的原因,以及对应的解决办法:
1. 错误读取了响应数据格式
你在done回调里使用data.responseJSON是个误区——jQuery的$.ajax在请求成功且响应是JSON格式时,data参数本身就是已经解析好的JSON对象,并不存在responseJSON这个属性(这个属性是原生XMLHttpRequest或Fetch API里的)。你现在相当于把undefined传给了Shiny.onInputChange,自然导致input$myinfo为空。
修正这部分代码:
.done(data => { // 如果Shiny端需要字符串格式的JSON,就用JSON.stringify Shiny.onInputChange('myinfo', JSON.stringify(data)); // 要是想让Shiny直接接收成R的列表/数据框,也可以直接传对象:Shiny.onInputChange('myinfo', data); })
2. 没有等Shiny完成连接就发送请求
你的代码在DOM就绪后立刻执行,但此时Shiny可能还没和后端服务器建立好连接,这时候调用Shiny.onInputChange无法正确把数据同步到Shiny的input系统里。建议把请求逻辑放到Shiny连接完成的事件回调中:
修改后的完整JavaScript代码:
$(document).on('shiny:connected', function() { $.ajax({ method : "GET", url : window.location.origin + "/mypath", dataType: "json" // 显式指定数据类型,确保jQuery自动解析JSON响应 }) .done(data => { console.log("请求成功,返回数据:", data); // 加日志方便调试看数据 Shiny.onInputChange('myinfo', data); }) .fail(data => { console.log("请求失败详情:", data.responseText); }); });
3. 先确认请求本身是否正常
你可以打开浏览器开发者工具的Network标签页,检查这个GET请求的状态:
- 看看请求的URL是否正确,有没有出现404错误
- 查看响应内容是否是你预期的JSON格式
- 确认响应头的
Content-Type是否为application/json(如果不是,jQuery不会自动解析,这时候需要手动用JSON.parse(data)来解析响应文本)
另外还要注意:你是否在Shiny后端配置了/mypath这个端点?比如有没有用shiny::addResourcePath或者设置对应的路由来处理这个GET请求?如果端点不存在,请求会直接进入fail回调,你可以通过console里的日志看到错误信息。
内容的提问来源于stack exchange,提问作者vladli
相关产品推荐
相关产品推荐

