【问题标题】:node promise - console prints the nested but cannot return value from firebase function节点承诺 - 控制台打印嵌套但不能从 firebase 函数返回值
【发布时间】:2019-10-02 16:00:14
【问题描述】:

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

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

我强烈觉得我没有正确使用 Promise。我正在处理以某种方式返回值的承诺,但我只能对我想要的值执行 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

【问题讨论】:

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


    【解决方案1】:

    试试这个:

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

    【讨论】:

    • 欧文,这很有帮助。这个问题现在已经为我解决了。我将更频繁地使用你的模式。我做了一项更改,我删除了 JSON.stringify。要检查的另一件事是避免使用 NodeJS 10 for Firebase 功能。 Nodejs 10 在 gcp 上仍然是每个 google 的测试版。不知道它是如何不断破坏我的身份验证的。
    猜你喜欢
    • 1970-01-01
    • 2019-03-07
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 2016-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多