节点诺言-控制台打印嵌套但无法从Firebase函数返回值

时间:2019-05-15 13:25:11

标签: node.js reactjs ecmascript-6 promise google-cloud-functions

首先,公平地说,我既不是开发人员,也不是reactjs或节点专家。我喜欢吸引我进入JavaScript世界的函数式编程和异步特性。我更像一个蟒蛇人。

我有一个firebase可调用函数。我可以使用console.log打印嵌套值,但是无法将值返回到我的react-redux应用程序。

我强烈认为我没有正确使用诺言。我正在处理以某种方式返回值的承诺,但只能在console.log上输入所需的值,但无法从firebase可调用函数

返回

我创建了如下的firebase可调用函数。 Redux操作会调用firebase可调用函数。我得到

// 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)
    })
  }
})

// react-redux存储操作

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 :(得分:0)

尝试一下:

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);
     }

})
相关问题