【问题标题】:getting `Cannot set headers after they are sent to the client` when exporting data to csv将数据导出到 csv 时出现“发送到客户端后无法设置标题”
【发布时间】:2019-02-28 13:06:10
【问题描述】:

我正在尝试将数据转换为 csv 并将其发送给客户端进行下载,但我收到了标题中指出的错误。

我正在使用节点 js 流,因为我正在处理大数据。

上面,你会找到我的代码。

router.get('/backoffice/moderateur/organismes/export/:status', checkAuth, checkProfile('moderateur'), tryAndCatch(async (req, res) => {

    let codeRegion = req.user.codeRegion;
    let { status } = await Joi.validate(req.params, {
        status: Joi.string().allow(['all', 'active', 'inactive']).default('all'),
    }, { abortEarly: false });

    let stream = await db.collection('accounts').find({
        profile: 'organisme',
        codeRegion: codeRegion,
        ...(status === 'all' ? {} : { passwordHash: { $exists: status === 'active' } }),
    }).stream();

    // const organismes = await db.collection('accounts').find({
    //     profile: 'organisme',
    //     codeRegion: codeRegion,
    //     ...(status === 'all' ? {} : { passwordHash: { $exists: status === 'active' } }),
    // }).toArray();

    res.setHeader('Content-disposition', 'attachment; filename=avis.csv');
    res.setHeader('Content-Type', 'text/csv; charset=iso-8859-1');
    let lines = 'SIRET;EMAIL;NOM\n'
    res.write(lines);

     // organismes.forEach(organisme => {
     //    lines += organisme.SIRET + ';' +
     //        organisme.courriel + ';' +
     //        comment.courriel + '\n';
     // });

     let handleError = e => {
         logger.error('An error occurred', e);
         res.status(500);
         stream.push(Boom.boomify(e).output.payload);
     };

     stream
     .on('error', handleError)
     .pipe(transformObject(async organisme => {
       return organisme.SIRET + ';' +
          organisme.raisonSociale + ';' +
          organisme.courriel + '\n';
     }))
     .pipe(encodeStream('UTF-16BE'))
     .pipe(res);

     // res.send(organismes);

}));

【问题讨论】:

    标签: node.js csv stream


    【解决方案1】:

    您尚未指定在哪一行收到此错误。

    但是,通过查看代码,我最好的猜测是您正在触发 handleError 尝试执行 res.status(500) 这将触发异常,因为您已经在此处隐式发送标头 res.write(lines)

    【讨论】:

      【解决方案2】:

      我必须在最后添加:

      .on('end', () => res.end());
      

      【讨论】:

        猜你喜欢
        • 2021-03-15
        • 2021-03-30
        • 2021-09-11
        • 2018-05-25
        • 2021-06-27
        • 2021-06-18
        • 2021-01-25
        • 1970-01-01
        相关资源
        最近更新 更多