m0_50180798 2020-10-22 15:01 采纳率: 0%
浏览 49

Koa2用excel-export模块导出mongodb文档,第一次发送请求正常导出xlsx格式,第二次提示无法连接mongodb,有谁遇到过类似的原因吗

class DownloadCTl {
async outputeExcel(ctx){
//引入模块
const {User} = require('../models/users')
const userlist = await User.find()
const nodeExcel= require('excel-export')

    const {fields = ""} = ctx.query;
    const OutputFields = fields.split(';')
    //构建导出结构
    let conf = {};
    conf.cols = [];
    const cols = ['名字','部门','性别','id','编码'];
    for(let item of cols){
            let tits = {};
            tits.caption = item;
            tits.type = 'string';
            conf.cols.push(tits);
    }
    const alldata = [];
    const tows = ['username','department','station','_id','gender'];
    for(let i in userlist){
        let row = [];
        for(let j of tows){
            let o = {};
            o[i] = userlist[i][j];
            row.push(o[i])
        }
        alldata.push(row)
    }
    conf.rows = alldata
    //将所有数据写入nodeExcel中
    var result = nodeExcel.execute(conf);
    //设置响应头
    //设置下载文件命名 支持的excel文件类有.xlsx .xls .xlsm .xltx .xltm .xlsb .xlam等
    ctx.set('Content-Type', 'application/vnd.openxmlformats');
    ctx.set("Content-Disposition", "attachment; filename=" + "Report.xlsx");
    let data = new Buffer.from(result,'binary');
    //Buffer.alloc(), Buffer.allocUnsafe(), or Buffer.from()
    ctx.body = data

}

}
module.exports = new DownloadCTl()

这个是注册路由的部分

const router = require('koa-router')()
const {outputeExcel} = require('../controllers/downloads')

router.prefix('/exportexcel')

router.get('/',outputeExcel);

module.exports = router

不知道为什么引用excel-expoprt这个模块那么麻烦,我放在类之外或者方法外面都是导致连接不上mongodb, const nodeExcel= require('excel-export')

然后最主要的问题是上面的可以正常运行第一次图片说明

格式和内容都是正确无误的
图片说明

然后再一次申请就提示无法连接到mongodb了图片说明

导出的文件也变成了json,并且是不含信息的,也是提示连接不上mongodb图片说明

问的同学好像说是生命周期结束了也没太明白
有没网友有遇到过类似的问题


  • 写回答

1条回答 默认 最新

  • lshen01 2023-03-16 18:38
    关注

    参考GPT和自己的思路:

    根据您提供的信息,可能是因为在第一次请求之后,未正确关闭MongoDB连接,导致第二次请求无法连接到MongoDB。您可以尝试在每次请求结束后手动关闭MongoDB连接,即在 outputeExcel 方法结尾处加上以下代码:

    await mongoose.connection.close();
    

    此外,您可以将 nodeExcel 模块的引入放在类外部,这样就不会因为多次引入导致问题。另外,建议使用 letconst 替代 var,有助于避免变量声明提升的问题。

    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作
  • ¥15 求NPF226060磁芯的详细资料