【问题标题】:Accessing the value of a promise inside an Express Route在 Express Route 中访问 promise 的值
【发布时间】:2018-08-17 12:10:54
【问题描述】:

所以基本上我正在尝试从单个 Google 电子表格中获取工作表列表(例如工作表 1、工作表 2)并将其显示在我的前端。 我已经启动并运行了一个 Node.js 服务器,并且可以从 Google 表格获取后端数据。

我想要做的是在呈现时将我的数组发送到我的页面。目前我可以在我的 console.log 中获取数据,但我的页面不会呈现。

index.js // 服务器

const express = require('express');

const path = require('path');

const myGenerator = require('./app/myGenerator.js')

const app = express();


app.set('view engine', 'pug');
app.set('views', path.join(__dirname, 'views'));
app.use(express.static('./app'));

app.get('/home', async (req, res, next) => {
  Promise.all([
    myGenerator.GetAllSheets()
  ]).then((value) => {
    res.render('home', { title: 'Hey', map1: value})
  })
});

app.listen(3000, () => console.log('Example app listening on port 3000!'));

myGenerator.js

module.exports = {
GetAllSheets: function() {
  return new Promise((resolve, reject) => {

    const googleSheetID = "REMOVED";

    // GOOGLE SHEETS CODE
    // Load client secrets from a local file.
    fs.readFile(__dirname + '/client_secret.json', (err, content) => {
      if (err) return console.log('Error loading client secret file:', err);
      // Authorize a client with credentials, then call the Google Sheets API.
      GoogleFunctions.authorize(JSON.parse(content), getData);
    });

    function getData(auth) {
      const sheets = google.sheets({version: 'v4', auth});
      sheets.spreadsheets.get({
        spreadsheetId: `${googleSheetID}`
        }, (err, res) => {
          if (err) return console.log('The API returned an error: ' + err);
          const rows = res.data.sheets;
          var map1 = rows.map(function(sheet) {
            return sheet.properties.title
          })
          console.log(map1);
          return map1;
      });
    }
  })
}
}

home.pug // 查看

doctype html
html(lang='en')
  head
    meta(charset='UTF-8') rel='stylesheet')
  body
    .container
      p The mysterious array should be here -> #{map1}

如果有人能指出我正确的方向,那将不胜感激。干杯

【问题讨论】:

  • 好吧,你永远不会从你的GetAllSheets 中获得resolvereject .. IOW:Promise((resolve, reject) 绝对没有做任何事情..
  • 我是个白痴,基思你是个传奇。将其添加进去,当然一切正常。我应该删除这个问题还是什么?关于 SO 的第一个问题
  • 保留给其他人通常是个好主意。我会发布一个突出显示修复的答案。
  • 很好的回应@Keith。 @GeoFro GetAllSheets 已经返回了一个可以解析为您的值的承诺,那么为什么要将它包装在 Promise.all([ ... ]) 中?这不是必需的,只有一个承诺,所以你可以做到myGenerator.GetAllSheets().then(...

标签: javascript node.js express google-sheets-api


【解决方案1】:

请记住,将new Promise 用于rejectresolve 时,您将得到一个永远不会结束的Promise。

以下是修复后的代码外观。

我已将 cmets 放置在我更改的 3 个地方。

在您的路线中添加catch 错误也是一个好主意,您可以返回500 错误等。

GetAllSheets: function() {
  return new Promise((resolve, reject) => {
    const googleSheetID = "REMOVED";
    fs.readFile(__dirname + '/client_secret.json', (err, content) => {
      //remember to also reject promise if error.
      if (err) return reject('Error loading client secret file:', err);
      GoogleFunctions.authorize(JSON.parse(content), getData);
    });

    function getData(auth) {
      const sheets = google.sheets({version: 'v4', auth});
      sheets.spreadsheets.get({
        spreadsheetId: `${googleSheetID}`
        }, (err, res) => {
          //again if we have error, reject
          if (err) return reject('The API returned an error: ' + err);
          const rows = res.data.sheets;
          var map1 = rows.map(function(sheet) {
            return sheet.properties.title
          })
          //lets return our result
          return resolve(map1);
      });
    }
  })
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 2020-09-13
    • 2017-08-08
    • 2020-05-30
    • 1970-01-01
    • 2015-04-07
    • 2021-12-14
    相关资源
    最近更新 更多