亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在一系列 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 關注
  • 190 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號