Облачная функция - как избежать вложенных обещаний? - PullRequest
0 голосов
/ 07 февраля 2020

Я впервые пишу облачные функции в NodeJS, и это работает очень хорошо, но всякий раз, когда я пытался развернуть, я получал предупреждение, подобное этому:

предупреждение Избегать вложенных обещаний обещание / no-nesting (строка 9)

Я пытался избавиться от этого, но есть некоторые проблемы, которые мне нужно решить:

exports.updateUserCount = functions.pubsub.schedule('every 2 minutes').onRun(context => {
    return admin.database().ref('/servers').once('value').then(snapshot =>{

        var ips = {}
        snapshot.val().forEach( (server, i) => { ips[server.label] = server.ipv4[0] })

        var promises = snapshot.val().map( (server, index) => {
            let sftp = new Client()
            return Promise.all([sftp, server.label, index, sftp.connect({ host : server.ipv4[0], port : '22', username : 'user_name', password : '*********' })])
            .then( values => {
                return Promise.all([values[0], values[0].get('/etc/openvpn/server/openvpn-status.log'), values[1], values[2]])
            }).then( data => {
                data[0].end()
                if (data[1]) {
                    let count = countWords(data[1].toString(),"client_list") - 1
                    console.log(count, `users connected now with ${data[2]} ${data[3]}`)

                    return Promise.all([ count, admin.database().ref(snapshot.child(index.toString()).ref).update({ userCount : count }) ])
                }
                console.log('file not found')
            return false
            }).catch(err => {
              console.log(err);
            });
        })

        console.log(`array ${JSON.stringify(ips)}`)
        return Promise.all(promises)
    }).catch(err => {
        console.log(err);
    });
});

Если я пытаюсь поставить другие код вне вложенности Я не могу получить экземпляр sftp, и он не может быть объявлен глобально, потому что каждый sftp связан и имеет конфиги разных серверов.

Любая помощь будет оценена и спасибо это заранее.

...