Я запускаю задания шаблона потока данных Google в облачной функции. Функция должна возвращать результаты каждого из запущенных заданий в виде одного ответа.
Описания заданий хранятся в базе данных Firestore.
Задания запускаются правильно, моя проблема возвращает ответы Job
от облачной функции (сервера).
app.get('/', (req, res) => {
var dataJob = {};
var workflow = fs.collection('dataprep-workflows').doc('18c').get()
.then((workflow) => {
if (!workflow.exists) throw (new Error('no workflow.'));
dataJob = workflow.data();
return workflow.ref.collection('dataflow-jobs').get();
})
.then(async (jobs) => {
if (jobs.empty) throw (new Error('no jobs'));
const authClient = await _authenticateWithGoogle();
const dataJobs = jobs.docs.map((job) => {
var o = JSON.parse(JSON.stringify(dataJob));
o.jobs = [job.data()];
return _launchDataFlowTemplate(authClient, o);
});
return Promise.all(dataJobs);
})
.then((responses) => {
console.log(responses);
return res.status(200).send(responses);
})
.catch(err => {
console.error('Error: ', err);
return res.status(500).send(err);
});
return workflow;
});
_authenticateWithGoogle
возвращает учетные данные клиента, которые я жду один раз, прежде чем передать их каждому _launchDataFlowTemplate()
, который возвращает Обещание
Я думал, что возврат Promises.all()
в цепочке разрешится следующим .then()
Чего мне не хватает?
Средство запуска задания потока данных:
function _launchDataFlowTemplate(authClient, dataJob) {
// code snipped
const dataflow = google.dataflow({
version: 'v1b3',
auth: authClient
});
return new Promise((resolve, reject) => {
dataflow.projects.templates.launch({
// template resource built from dataJob
}
}, (err, response) => {
if (err) {
console.error('Dataflow template launch failed because of ', err);
reject(err);
} else {
resolve(response.data.job);
}
});
});
}
Аутентификация:
function _authenticateWithGoogle(scopes) {
console.log("Authenticating...");
scopes = scopes || [
'https://www.googleapis.com/auth/cloud-platform',
'https://www.googleapis.com/auth/compute',
'https://www.googleapis.com/auth/compute.readonly',
'https://www.googleapis.com/auth/userinfo.email'
];
return new Promise((resolve, reject) => {
google.auth.getApplicationDefault((err, authClient, projectId) => {
if (err) {
console.error('Authentication failed because of ', err);
reject(err);
}
if (authClient.createScopedRequired && authClient.createScopedRequired()) {
authClient = authClient.createScoped(scopes);
authClient.projectId = projectId;
}
console.log('Authenticated.');
resolve(authClient);
});
});
}