Как правильно обрабатывать функцию async.series через module.expotrs в Node.js - PullRequest
0 голосов
/ 29 апреля 2019

Идея состоит в том, что я сохраняю данные API в электронной таблице и использую модуль "google-spreadsheet", чтобы извлечь их, а затем использую их в дальнейших операциях. Если я запускаю функцию получения данных из "ss.js", я получаю асинхронный ответ, так как

async.series

выполняет функции последовательно по одной. Однако, если я попытаюсь использовать эту функцию в "index.js", я смогу запустить функцию, но не могу понять, почему я получаю следующую ошибку:

TypeError: Невозможно прочитать свойство 'api_key' из неопределенного

в ss.getTGAuth.then (..... / routs / index.js: 14: 34) // отредактировано

{api_key: 'true_key', api_hash: 'true_hash'} // отредактировано

Если я использую одну асинхронную функцию, а не async.series, все работает как положено. Вот файлы проблем. В коде есть комментарии, которые должны помочь понять.

----- ss.js -------

var GoogleSpreadsheet = require('google-spreadsheet');
var async = require('async');
var creds = require('./client_secret.json');

let getTGAuth = () => {
      let doc = new GoogleSpreadsheet('sheetId');//the real ID is redacted
      let sheet;
      let tasks = [
            function setAuth(step) {
                  doc.useServiceAccountAuth(creds, step);
            },
            function getInfoAndWorksheets(step) {
                  doc.getInfo(function(err, info) {
                  sheets = info.worksheets;
                        for (let i = 0; i < sheets.length; i++){
                              if(sheets[i].title == 'auth'){
                                    sheet = sheets[i];
                                    if (err) {
                                          step(err);
                                    }
                                    step();
                              }
                        }
                  });
            },
            function workingWithRows(step) {
                  sheet.getRows(0,function(err,rows){
                        if (err) {
                              step(err);
                        }
                        step(null,{'api_key':rows[0].apikey,'api_hash':rows[0].apihash});
                  });
            }
      ];
      let res = async.series(tasks, (err, results) => {
            if (err) {
                  console.log(err);
            }
            console.log(results[2]);// this gets executed with proper results
            return results[2];
      })
      return res;
}
module.exports = { getTGAuth: getTGAuth };

----- index.js -----

let express = require('express');
let router = express.Router();
const ss = require('../ss.js');

router.get('/', (req, res, next) => {
        ss.getTGAuth().then((r) => {
            console.log('API KEY: '+ r.api_key); // this is where I get "TypeError: Cannot read property 'api_key' of undefined"
            res.render('index', { api_key: r.api_key,api_hash: r.api_hash});
        }).catch((e) => console.log(e));
});

module.exports = router;

Очевидно, что все подключено правильно, функция вызывается и распознается, поскольку при вызове .then () нет ошибки, но на самом деле она не ожидает результатов.

...