在Express服务器上生成文件并启动客户端下载提示?

时间:2018-08-20 21:43:09

标签: javascript node.js excel reactjs exceljs

我正在使用ExcelJS模块生成Excel文件,但是难以实现所需的流程。

我想拥有的是:

  1. 用户单击前端(由React构建)上的按钮以下载Excel文件。这会触发fetch('/ downloads / results'),这是文件创建和服务的后端端点。
  2. 文件已生成,并作为获取请求的结果发送到/ downloads / results。
  3. 用户从前端的浏览器获得下载提示,以便他们可以决定将其保存在何处。

现在发生的事情是,Node并未在前端提示用户,而是在与服务器文件相同的文件夹中创建Excel文件。创建文件的代码是“ workbook.xlsx.writeFile('Project.xlsx')”

我当前的代码如下。

相关的服务器端代码块:

function generateSpreadsheet(req, res) {

    const workbook = new Excel.Workbook();
    workbook.creator = 'Project';
    workbook.created = new Date();

    const worksheet = workbook.addWorksheet("Definitions");

    worksheet.columns = [
        { header: 'Word', key: 'word', width: 36 },
        { header: 'Definition', key: 'def', width: 120 }
    ];

    worksheet.addRows(storedResults);

    workbook.xlsx.writeFile('Project.xlsx');

}

app.get('/downloads/results', (req, res) => {
    try {
        generateSpreadsheet();
    } catch(err) {
        console.log(err);
    }
})

相关的前端代码:

renderDownloadButton() {
    if (this.state.queriesList.length > 0) {
        return (
            <button onClick={this.download}>
                Export Results
            </button>
        )
    }
}

download() {
    fetch('/downloads/results');
}

过去几天的大部分时间里我一直在研究,但仍未找到令人满意的解决方案。

我试着让generateSpreadsheet函数返回一个流,以为我可以将其通过管道传递到app.get中的res,但是我有点被绊倒了。

感谢您提供的任何见解/指导!

0 个答案:

没有答案