0

我有一个带有 Node 和 Express 的 API 后端。我正在尝试从前端获取一些过滤数据并创建一个 CSV 文件并为用户下载它。我一直在使用json2csv。我能够正确创建数据文件,并且当我在我的快速路线中使用该文件时,我下载了一个只显示未定义的文件。起初,我认为这是一个异步问题,但在使用 setTimeout 作为测试以查看这是否是一个问题后,我仍然得到未定义的数据文件。控制台记录“csvData”显示正确的数据。

快速下载文件的路径。

app.post('/api/downloads/filtered', (req, res) => {
    let fields = [];
    fields = Object.keys(req.body[0])
    const filteredData = req.body;
    const json2csvParser = new json2csv({fields: fields});
    const csvData = json2csvParser.parse(filteredData);
    console.log(csvData)
    fs.writeFile('./report.csv', csvData, (err) => {
        if (err) {
            console.log(err);
        }
        else {
            console.log('created report.csv');
            res.download('./report.csv');
        }
    })
})

我在前端使用 Vue,单击按钮时获取文件,不确定是否应该包含该文件。

4

1 回答 1

0

我最终弄清楚了我的问题。我发现在发布请求中下载似乎是不可能的。我需要一个获取请求。由于文件的数据出现在请求正文中,我最终保留了创建文件的发布请求并创建了一个单独的获取请求来下载文件,这似乎工作正常,但在任何地方都没有找到它,所以我没有确定是否存在更好的方法。

app.post('/api/downloads/filtered', (req, res) => {
    console.log(req.body)
    let fields = [];
    fields = Object.keys(req.body[0])
    const filteredData = req.body;

    const json2csvParser = new json2csv({fields: fields});
    const csvData = json2csvParser.parse(filteredData);
    console.log(csvData)
    fs.writeFile('./report.csv', csvData, (err) => {
        if (err) {
            console.log(err);
        }
        else {
            console.log('created report.csv');
        }
    })
})

app.get('/api/downloads/filtered', (req, res) => {
    setTimeout(() => {res.download('./report.csv')}, 1000)
})

于 2019-12-05T22:51:27.467 回答