登录
注册
node.js 学习社区
nodejs 发送10万条数据(大概60M),网速慢的时候总是失败

huazhifang

2017-09-04 13:03

最近发现一个奇怪的问题,当网速快的时候,用response.write写回10万条数据可以成功,如果限制网速到100k,就总是失败,当失败时,客户端收到的error status是0, 考虑过是不是timeout了,添加response.setTimeout(60000)也没有效果,测试代码如下,请大牛指点一下是怎么回事?


服务器端代码


if (format == 'csv') {

res.setHeader("Content-Type", "text/csv;charset=UTF-8");

} else {

res.setHeader("Content-Type", "text/plain;charset=UTF-8");

}

res.write(csv_cols_label + "\n");

var m_total_rows ="----------------------------------------------------------";

for (var i = 0; i < 100000; i++){

res.write(m_total_rows + i + ";\n");

}

res.end('');


客户端代码:



this.download = function (url, data, targetName, onSuccess, onFail) {

var requestData = {

url: url,

method: "POST",

headers: {

'Content-type': 'application/json'

},

responseType: 'blob',

timeout:600000

};

if (data) {

requestData.data = data;

}

$http(requestData)

.success(function (data) {

var textFileAsBlob = new Blob([data], {type: "blob"});

var fileNameToSaveAs = targetName;

var downloadLink = document.createElement("a");

downloadLink.download = fileNameToSaveAs;

downloadLink.innerHTML = "Download File";

{

downloadLink.href = window.URL.createObjectURL(textFileAsBlob);

downloadLink.onclick = destroyClickedElement;

downloadLink.style.display = "none";

document.body.appendChild(downloadLink);

}

downloadLink.click();

if (onSuccess) {

onSuccess();

}

})

.error(function (data,status) {

alert(status);

if (onFail) {

onFail();

}

})

};




回复 · 2

  • 我只看了服务端的代码,猜想如下:

    1. res.write()是异步操作,而你直接用的for循环,写操作根本还没执行完后,就已经执行res.end()函数了。

    2. 这个问题应该和网速没有多大的关系吧。

    3. 解决办法: Promise.all()

    1

  • 楼上解释的对,看代码应该刚滑过来的兄弟,有IO操作的地方,不能用普通的for循环语句,因为IO操作是异步的,需要回调才能确定IO访问结束了,否则就丢了

    0

发表回复

你可以在回复中 @ 其他人