Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 如何使用exceljs从承诺中返回文档_Node.js_Api_Exceljs - Fatal编程技术网

Node.js 如何使用exceljs从承诺中返回文档

Node.js 如何使用exceljs从承诺中返回文档,node.js,api,exceljs,Node.js,Api,Exceljs,我有有限的节点经验,所以请原谅我,如果这是基本的 我有一个控制器方法,它应该返回一个可下载的excel文档。 我不确定如何返回文档以供下载,特别是在响应对象周围 我不确定在哪里声明响应对象 下载功能在我的test express项目中使用时效果非常好,就像这样…您可以从中看到res响应对象 函数(req,res){} 然后我可以从中返回文档 var Excel = require('exceljs'); app.get('/doexcel/', function (req, res) {

我有有限的节点经验,所以请原谅我,如果这是基本的

我有一个控制器方法,它应该返回一个可下载的excel文档。 我不确定如何返回文档以供下载,特别是在响应对象周围

我不确定在哪里声明响应对象

下载功能在我的test express项目中使用时效果非常好,就像这样…您可以从中看到res响应对象

函数(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项目中的一些现有控制器的基础上,我设置了如下控制器。显然,被引用的“response”对象不存在

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 */
}
var Excel=require('exceljs');
//控制器方法
函数getReport(clientId,query){
返回新承诺(功能(解决、拒绝){
如果(!query.filter.noteId){
return-reject(新的apirerror.BadRequest(“NoteId是一个必需的查询参数,用法:?NoteId=note123&”);
}
//从数据源获取报表数据
var reportData=getReportData(clientId,query);
//使用exceljs构建工作簿
var dataWorkbook=CreateWorkbook(reportData);
返回解析(数据工作簿);
});
}
//创建Excel工作簿
函数CreateWorkbook(reportDataVal)
{
var datetime=新日期();
var workbook=新建Excel.workbook();
var worksheet=workbook.addWorksheet('Data\u Report\u'+datetime);
工作表.properties.outlineProperties={
总结如下:错误,
summaryRight:错,
showDetail:false,
};
工作表.addRow(['Random Data','More Random Data']);
/*供下载的流文件*/
答复.现状(200);
response.setHeader('Content-Type','text/xlsx');
response.setHeader(
“内容处置”,
'附件;文件名=teststream.xlsx'
);
workbook.xlsx.write(响应)
.然后(函数(){
答复:end()
});
/*供下载的流文件*/
}
在这种情况下,我应该如何或在何处声明“response”对象以允许返回可下载的文档


谢谢。

您有两个选择:

  • CreateWorkbook
    返回工作簿,然后在路由处理程序中执行以下代码:
  • 将res对象从路由处理程序传递到
    CreateWorkbook
    中,并在那里使用它:

  • 这里有两个选项:

  • CreateWorkbook
    返回工作簿,然后在路由处理程序中执行以下代码:
  • 将res对象从路由处理程序传递到
    CreateWorkbook
    中,并在那里使用它:
  • 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()
        });
    
    //Create Excel workbook
    function CreateWorkbook(reportDataVal, res) 
    {
        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 */
    }