我在服务器端使用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诊断控制台未显示任何错误。