обещание узла - консоль печатает вложенное, но не может вернуть значение из функции firebase - PullRequest
1 голос
/ 15 мая 2019

Во-первых, честно говоря, я не являюсь ни разработчиком, ни реагирующим, ни экспертом по узлам. Я люблю функциональное программирование и асинхронную природу, которая привела меня в мир javascript. Я больше питоник.

У меня есть функция вызова из Firebase. Я могу напечатать вложенное значение с помощью console.log, но, тем не менее, не смог вернуть значение обратно в мое приложениеact-redux.

Я чувствую, что не правильно использую обещания. Я обрабатываю обещания каким-то образом вернуть значения, но могу сделать console.log только для того значения, которое я хочу, но не могу вернуть его из вызываемой функции firebase

Я создал вызываемую функцию firebase следующим образом. Действие Redux вызывает вызываемую функцию Firebase. Я получаю

// функция вызова пожарной базы

const functions = require('firebase-functions');
const cors = require('cors')({origin: true});
const dns = require('dns');
const util = require('util')


const getIP = function(domain) {
    return new Promise((resolve, reject) => {
        dns.lookup(domain, (err, res) => {
            if(err) {
                reject(err)
            }
            if (res) {
                resolve(JSON.stringify(res))
            }
        })
    })
}

exports.getIP = functions.https.onCall((data, context) => {
  return {
    addresses: getIP(data.domain).then((res) => {
      console.log(res)
      return res
    }).catch((err) => {
      console.log(err)
    })
  }
})

// действие хранилища реагировать на избыточность

export const getIPAddress = (domain) => {
    return (dispatch, getState, {getFirebase}) => {
        const firebase = getFirebase();
        var dr = firebase.functions()

        dr({
            domain: domain
        }).then((result) => {
            console.log("check", result)
            dispatch({ type: 'IPADDRESS_SUCCESS', result: result});
        }).catch((err) => {
            dispatch({ type: 'IPADDRESS_ERROR', err: err });
        })
    }
}

Ожидаемый результат: ['ipaddress1', 'ipaddress2']

Токовый выход: объект

data:
addresses:
domain: {domain: null, _events: {…}, _eventsCount: 1, _maxListeners: null, members: Array(0)}
__proto__: Object
__proto__: Object
__proto__: Object
type: "IPADDRESS_SUCCESS"
__proto__: Object

1 Ответ

0 голосов
/ 15 мая 2019

Попробуйте это:

const functions = require('firebase-functions');
const cors = require('cors')({origin: true});
const dns = require('dns');
const util = require('util')


const getIP = function(domain) {
    return new Promise((resolve, reject) => {
        dns.lookup(domain, (err, res) => {
            if(err) {
                reject(err)
            }
            if (res) {
                resolve(res)
            }
        })
    })
}

exports.getIP = functions.https.onCall(async (data, context) => {
     try {
       return {
         addresses: await getIP(data.domain)
       };
     } catch (err) {
       console.log(err);
     }

})
...