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

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 设计程序,利用函数getCharacterCnt,实现求解出str所指字符串中指定字符的个数,并返回此值。
    • ¥15 设计程序,实现管理30个学生5门课程的成绩,功能模块要求如下。
    • ¥15 B660主板安装xp系统老是出现错误怎么办
    • ¥15 定义过的变量报错未定义
    • ¥15 如何在EXCEL某单元格中查找是否存在另一列中的内容。
    • ¥50 非对称加密(相关搜索:密码学)
    • ¥15 关于非编程寻迹小车的分析
    • ¥15 java导出EXCEL这里已经执行成功了,但是流浪器没有下载
    • ¥15 帮我把代码改的能正常运行就行
    • ¥50 有限元修正、模型修正、最小二乘法,详细步骤