Идея состоит в том, что я сохраняю данные 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 () нет ошибки, но на самом деле она не ожидает результатов.