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

我正在尝试使用 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>


互换的青春
浏览 159回答 1
1回答

慕雪6442864

问题就出在这一行:const colsdata = cols1.map((element) => {res.set('Content-Type', 'text/html');res.render('portfolio', {&nbsp; &nbsp;headlinePortfolio: element[0],&nbsp; &nbsp;subheadlinePortfolio: element[1],&nbsp; &nbsp;image1: element[3],&nbsp; &nbsp;client: element[4],&nbsp; &nbsp;campaign: element[5]&nbsp;})})您不能渲染多次。Render调用res.send()方法将数据发送到前端。所以发生的事情是:您发送 (res.send()) 多次(因为 res.render 在地图内),因此出现错误。为了防止渲染发送数据,您必须提供如下回调:res.render('portfolio', {&nbsp; &nbsp;headlinePortfolio: element[0],&nbsp; &nbsp;subheadlinePortfolio: element[1],&nbsp; &nbsp;image1: element[3],&nbsp; &nbsp;client: element[4],&nbsp; &nbsp;campaign: element[5]&nbsp;}, ()=>console.log(`template created do something`))当您准备好发送所有内容时,您将尝试一次性发送所有内容:res.send(data)此外,您router.get必须异步才能等待关键字工作。更多更新:您已经更新了您的答案,因此这是我上面分享的所有内容的一种更愚蠢的方法。您正在尝试创建一个模板,但问题是您正在创建多个模板,因为您正在循环内使用函数。您应该做的是将函数从循环中删除。不幸的是,我无法准确地教授如何实现您想要实现的目标。我将重现一个最小输出,以便您可以从那里开始工作:注意:为了简化,这里不存在的所有内容都应该保持不变。&nbsp;/* GET portfolio page. */&nbsp; router.get('/', async function (req, res, next) {&nbsp; &nbsp; &nbsp;...&nbsp; &nbsp; const cols1 = spreadvals1.data.values || [];&nbsp; // I have removed the .map fn. You should do the same&nbsp; &nbsp; res.set('Content-Type', 'text/html');&nbsp; &nbsp; res.render('portfolio', {&nbsp; &nbsp; &nbsp; &nbsp;headlinePortfolio: cols[0][0], //row 1 - elem (col) 1&nbsp; &nbsp; &nbsp; &nbsp;subheadlinePortfolio:cols[0][1], //row 1 - elem&nbsp; (col) 2&nbsp; &nbsp; &nbsp; &nbsp;image1: cols[0][3], //row 1 - elem (col) 4&nbsp; &nbsp; &nbsp; &nbsp;client: cols[0][4],//row 1 - elem (col) 5&nbsp; &nbsp; &nbsp; &nbsp;campaign: cols[0][5], // row 1 - elem (col) 6&nbsp; &nbsp; &nbsp;})&nbsp;}&nbsp;});&nbsp; module.exports = router;对于上面的示例,您将不会出现错误,并且只会获得第一行。如果您想要下一行,则必须增加row[1]、row[2]、row[3]等等...如果您想要来自不同行的多个(分隔的)模板,您将必须深入挖掘并理解我所说的回调并用 map 来实现它。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript