为了账号安全,请及时绑定邮箱和手机立即绑定

如何在一系列 Google 电子表格中循环

如何在一系列 Google 电子表格中循环

互换的青春 2023-08-24 15:35:43
我正在尝试使用 Express 渲染 Google 电子表格中的数据,并将要渲染的单元格范围放入其中并循环后,出现错误:“错误 [ERR_HTTP_HEADERS_SENT]:在将标题发送到客户端后无法设置标题”。该电子表格有 3 行和 6 列,我不确定我做错了什么,因为错误是持续存在的,无论如何我都无法摆脱它。我的代码: const express = require('express'); const router = express.Router(); const {google} = require('googleapis'); const keys = require('../credentials.json'); const {   google  } = require('googleapis');  const keys = require('../credentials.json');  /* GET portfolio page. */  router.get('/', function (req, res, next) {  const client = new google.auth.JWT(  keys.client_email,  null,  keys.private_key,   ['https://www.googleapis.com/auth/spreadsheets.readonly']  );  client.authorize(function (err) {   if (err) {     console.log(err);     return;     } else {       console.log('Connected');       gsrun(client);     }    });     async function gsrun(cl) {     const gsapi = google.sheets({     version: 'v4',     auth: cl    });     const optPort1 = {     spreadsheetId: '1W1OKGmGU6Io-1FhWjZLyPkGZz9Ky829zurAzcwmXiHg',     range: ['Portfolio Page!A4:F6']   };   let spreadvals1 = await gsapi.spreadsheets.values.get(optPort1);   console.log(spreadvals1.data.values);    const cols1 = spreadvals1.data.values || [];    const colsdata = cols1.map((element) => {    res.set('Content-Type', 'text/html');    res.render('portfolio', {       headlinePortfolio: element[0],       subheadlinePortfolio: element[1],       image1: element[3],       client: element[4],       campaign: element[5]     })   }); } });  module.exports = router;我的 HTML 看起来像这样:   <div class="page-header">   <div class="text-headline">       <div class="salutation">{{headlinePortfolio}}</div>   </div>   <div class="text-subheadline">       <div class="descr">{{subheadlinePortfolio}}</div>   </div>
查看完整描述

1 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

问题就出在这一行:


const colsdata = cols1.map((element) => {

res.set('Content-Type', 'text/html');


res.render('portfolio', {

   headlinePortfolio: element[0],

   subheadlinePortfolio: element[1],

   image1: element[3],

   client: element[4],

   campaign: element[5]

 })

})


您不能渲染多次。Render调用res.send()方法将数据发送到前端。所以发生的事情是:您发送 (res.send()) 多次(因为 res.render 在地图内),因此出现错误。


为了防止渲染发送数据,您必须提供如下回调:


res.render('portfolio', {

   headlinePortfolio: element[0],

   subheadlinePortfolio: element[1],

   image1: element[3],

   client: element[4],

   campaign: element[5]

 }, ()=>console.log(`template created do something`))

当您准备好发送所有内容时,您将尝试一次性发送所有内容:res.send(data)


此外,您router.get必须异步才能等待关键字工作。


更多更新:


您已经更新了您的答案,因此这是我上面分享的所有内容的一种更愚蠢的方法。


您正在尝试创建一个模板,但问题是您正在创建多个模板,因为您正在循环内使用函数。您应该做的是将函数从循环中删除。


不幸的是,我无法准确地教授如何实现您想要实现的目标。我将重现一个最小输出,以便您可以从那里开始工作:


注意:为了简化,这里不存在的所有内容都应该保持不变。


 /* GET portfolio page. */

  router.get('/', async function (req, res, next) {


     ...

    const cols1 = spreadvals1.data.values || [];



  // I have removed the .map fn. You should do the same


    res.set('Content-Type', 'text/html');

    res.render('portfolio', {

       headlinePortfolio: cols[0][0], //row 1 - elem (col) 1

       subheadlinePortfolio:cols[0][1], //row 1 - elem  (col) 2

       image1: cols[0][3], //row 1 - elem (col) 4

       client: cols[0][4],//row 1 - elem (col) 5

       campaign: cols[0][5], // row 1 - elem (col) 6

     })


 }

 });


  module.exports = router;

对于上面的示例,您将不会出现错误,并且只会获得第一行。如果您想要下一行,则必须增加row[1]、row[2]、row[3]等等...如果您想要来自不同行的多个(分隔的)模板,您将必须深入挖掘并理解我所说的回调并用 map 来实现它。


查看完整回答
反对 回复 2023-08-24
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信