尝试通过管道将响应发送到客户端时,节点js HTTP 500.1016错误

时间:2019-03-01 11:01:19

标签: javascript node.js express stream

我在服务器端使用reactJs和Node。我需要允许用户单击“下载数据”按钮,该按钮将调用Node api。 Node api在mySQL db中查询特定的表,并使用fast-csv将响应通过管道返回给用户。 在客户端,我使用streamSaver接收响应流,并写入一个下载的csv文件。

所有这些在我的本地计算机上都可以正常工作,但是当我部署到内部Azure站点时,如果有1个以上的块,则会出现以下http错误。对于小桌子,下载工作正常。

  

HTTP错误500.1016-内部服务器错误

这是我的客户呼叫和响应处理代码:

handleDownloadData = () => {
  const streamSaver = require('streamsaver');
  const obj = {
    tableName: tableName
  };
  fetch(url, {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(obj)
  }).then(res => {
    const fileStream = streamSaver.createWriteStream(tableName + '.csv');
    const writer = fileStream.getWriter();

    if (res.body.pipeTo) {
      writer.releaseLock();
      return res.body.pipeTo(fileStream);
    }

    const reader = res.body.getReader();
    const pump = () =>
      reader
        .read()
        .then(({ value, done }) =>
          done ? writer.close() : writer.write(value).then(pump)
        );

    pump().then(() => {
      message.destroy();
      message.success('Download completed');
    });
  });
};

这是节点api:

app.post('/api/someurl/:someParam', (req, res) => {
  let pool = mysql.createPool({
    host: config.host,
    user: config.username,
    password: config.password,
    database: config.database,
    port: config.port
  });

  const tableName = req.body.tableName;
  if (typeof tableName !== 'undefined') {
    pool.getConnection(function(err, con) {
      let sql = `SELECT * FROM ${con.config.database}.${tableName}`;

      res.status(200);
      res.setHeader(
        'Content-disposition',
        'attachment; filename=' + tableName + '.csv'
      );
      res.setHeader('Content-type', 'text/csv');

      let csvStr = csv.createWriteStream({ headers: true });

      // open database stream
      var dbStr = con.query(sql).stream();

      // connect the streams
      dbStr.pipe(csvStr).pipe(res);
    });
  } else {
    res.send([]);
  }
});

是否有任何原因会导致在Azure或一般通过远程服务器失败? Kudo诊断控制台未显示任何错误。

0 个答案:

没有答案