【问题标题】:NodeJS - how to tell the nodeJS server to send not as chunked transfer? so that Ajax can receive itNodeJS - 如何告诉 nodeJS 服务器发送不是分块传输?以便 Ajax 可以接收它
【发布时间】:2016-08-05 04:41:41
【问题描述】:

我有一个数据传入 NodeJS,然后需要将其提供给 Ajax 查询。但是由于 NodeJS 将其作为分块数据传输,因此没有一个通用的 Javascript/JQuery ajax 方法能够捕获数据包。

我怎样才能得到值

nodeJS:

http.createServer(options, (req, res) => {
    msg = c++_to_javascript();

    res.writeHead(200);
    res.end(msg);

}).listen(89);

Javascript/JQuery:

transfer encoded: chunked 接收数据,结果没有任何方法能够在 JS 中解码接收到的数据包。

我如何从 NodeJS 或 JS 中解决它?

尝试 1:失败

$.stream(javascript_to_c++,{
                        open:function(){
                            console.log("opened");
                        },
                        message:function(event){
                            console.log(event.data);
                            buf1 = buf1 + event.data;
                        },
                        error:function(){
                            console.log("error");
                        },
                        close:function(){
                            console.log("closed");
                        }
                    });

TRY2:失败

  var test =  $.ajax({
    type: "GET",
    url: javascript_to_c++,
    async: false,
    success:function(m) {
      buf1 = buf1 + m;
    }
  }).responseText;
  console.log(test);

尝试 3:失败

// Define a method to parse the partial response chunk by chunk
var last_index = 0;
function parse(xhr) {
  var curr_index = xhr.responseText.length;
  if (last_index == curr_index) return; // No new data
  var s = xhr.responseText.substring(last_index, curr_index);
  last_index = curr_index;
  console.log(s);
}

function test() {

  var xhr = new XMLHttpRequest();

  var url = javascript_to_c++;

  xhr.open("GET", url, true); 
  xhr.send();

  // Check for new content every 5 seconds
  var interval = setInterval(parse, 5000);

  // Abort after 25 seconds
  setTimeout(function(){
    clearInterval(interval);
    parse(xhr);
    xhr.abort();
  }, 25000);

}

test();

【问题讨论】:

  • Web 浏览器可以透明地处理分块传输。这里可能还有其他问题。分块传输不太可能是问题。
  • c++_to_javascript 的返回值是什么样的?另外,为什么 javascript_to_c++ 是您的 Ajax 调用的端点?
  • 该代码不是在等待 ajax 调用完成,而是在 ajax 调用完成之前进行解析。如果他使用常规 ajax 调用,他将收到 100% 的消息,但他必须等待几分钟(直到服务器关闭连接)
  • 你能比说“失败”更具体吗?究竟会发生什么?错误信息?如果是这样,那是什么。出乎意料的结果?如果有,是什么?
  • 正如我之前提到的,这些都不是必需的。浏览器可以完美地处理传输编码。其他事情正在发生。传输编码不是问题。尝试使用curl 获取页面并发布结果。使用-v 标志。

标签: javascript jquery ajax node.js google-chrome


【解决方案1】:

您只需要正确等待响应返回即可。我对您使用的其他 ajax 方法不太熟悉,但让我们看一下这个例子:

  var test =  $.ajax({
    type: "GET",
    url: javascript_to_c++,
    async: false,
    success:function(m) {
      buf1 = buf1 + m;
    }
  }).responseText;
  console.log(test);

您是否希望test 成为响应$.ajax 返回一个代表异步请求的 Promise。直到调用成功回调或解决承诺时,您才会收到响应文本。试试这个:

var test =  $.ajax({
  type: "GET",
  url: javascript_to_c++, // I'm assuming this is a valid URL?
  success:function(content) {
    console.log(content); // This is your actual full response. 
  }
});

只要让节点进程指定内容类型,试试content-type 标头:

res.set('content-type', 'text/plain');
res.end(msg);

更新

正如已经指出的那样,Transfer-Encoding 这件事实际上是一个问题是非常值得怀疑的。如果您确实想禁用它,请执行以下操作:

res.set('transfer-encoding', '');

...但实际上,它不应该是必要的。

另一个更新

不使用快递?你只需要稍微修改一下:

res.writeHead(200, { 
  'content-type': 'text/plain',
  'transfer-encoding': '' // not recommended... 
});
res.end(msg);

【讨论】:

  • Transfer-Encoding 与内容类型无关。这是转移的技术;您可以使用分块传输编码获得任何您想要的内容类型。
  • 检查你的代码;您的语法与我发布的不符。
  • 发布你的整个代码;不可能知道你实际上在做什么。
  • 我真的不认为存在浏览器错误;用您最近的尝试、客户端和服务器更新您的问题。 Ajax 不会冻结您的浏览器。如果响应需要 2-3 分钟,则服务器发送响应不正确。
  • 先生,它现在正在工作。您的最后一个标头设置已解决问题 (stackoverflow.com/a/18311469/285594)
猜你喜欢
  • 2015-11-05
  • 2014-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2015-10-14
  • 1970-01-01
  • 2012-01-30
  • 1970-01-01
相关资源
最近更新 更多