Как вернуть документ из Promise, используя exceljs - PullRequest
0 голосов
/ 16 мая 2019

У меня ограниченный опыт работы с узлами, поэтому, пожалуйста, простите меня, если это элементарно.

У меня есть метод Controller, который должен возвращать загружаемый документ Excel.Я не уверен, как мне вернуть документ для загрузки, особенно вокруг объекта ответа.

Я не уверен, где объявить объект ответа ...

Функциональность загрузки прекрасно работаетпри использовании в моем тестовом экспресс-проекте, например, так ... как вы видите объект ответа res, поступающий из

function(req, res){}

, из которого я могу затем вернуть документ.

var Excel = require('exceljs');

app.get('/doexcel/', function (req, res) {
  var nameVal1 = req.params.name1;

  user.user.model('Contact').find({}, function (err, users1) {

    var workbook = new Excel.Workbook();
    var worksheet = workbook.addWorksheet('My Sheet');


    worksheet.addRow(['09/05/2019', 'Test Msg Title example ' + i, 'Test Message Body Example Example']);

    var filename = 'C:\\myStuff\\TestProjects\\NodeTestProjects\\ExpressExample\\files\\ExampleWriteFile.xlsx';
    workbook.xlsx.writeFile(filename)
      .then(function () {
        // done
        //res.send(200);
        console.log('written file');
      });

    /*stream file for download */
    res.status(200);
    res.setHeader('Content-Type', 'text/xlsx');
    res.setHeader(
      'Content-Disposition',
      'attachment; filename=teststream.xlsx'
    );
    workbook.xlsx.write(res)
      .then(function () {
        res.end()
      });

    /*stream file for download */

  });
});

Итак, следуя некоторым из существующих контроллеров в проекте PROD, я настроил контроллер, как показано ниже.Очевидно, что «ответный» объект, на который ссылаются, не существует.

var Excel = require('exceljs');

//Controller Method
function getReport(clientId, query) {
    return new Promise(function (resolve, reject) {

        if (!query.filter.noteId) {
            return reject(new apiError.BadRequest("NoteId is a mandatory query parameter, usage: <url>?noteId=note123&<optional params>"));
        }

        //get report data from datasource
        var reportData = getReportData(clientId, query);

        //Build Workbook using exceljs
        var dataWorkbook = CreateWorkbook(reportData);

        return resolve(dataWorkbook);
    });
}

//Create Excel workbook
function CreateWorkbook(reportDataVal) 
{
    var datetime = new Date();
    var workbook = new Excel.Workbook();
    var worksheet = workbook.addWorksheet('Data_Report_' + datetime);

    worksheet.properties.outlineProperties = {
        summaryBelow: false,
        summaryRight: false,
        showDetail: false,
    };

    worksheet.addRow(['Random Data', 'More Random Data']);

    /*stream file for download */

    response.status(200);
    response.setHeader('Content-Type', 'text/xlsx');
    response.setHeader(
        'Content-Disposition',
        'attachment; filename=teststream.xlsx'
    );
    workbook.xlsx.write(response)
        .then(function () {
            response.end()
        });

    /*stream file for download */
}

Как или где мне следует объявить объект «ответ» в этом случае, чтобы разрешить возврат загружаемого документа?

Спасибо.

...