如何从另一个CF内部请求Google Cloud Function(CF)?

时间:2018-06-02 14:19:53

标签: google-cloud-platform google-cloud-functions axios

我正试图从另一个CF内部用 axios 调用Google Cloud Function(CF),但我一直在 这个错误:

TypeError: A value undefined was yielded that could not be treated as a promise

我从处理程序调用{​​{1}}并在执行任何数据库更新之前调用update()

以下是代码:

clientHasRightToEdit

在我的package.json中,我声明了axios依赖:

const axios = require('axios')
var Promise = require('bluebird')

let clientHasRightToEdit = (req) =>{
   let clientToken = req.query.token
   let objectId = req.query.objectId

   let verificationUri = "[ANOTHER_CF_HTTP_TRIGGER]"
   return axios.get(verificationUri, {
      params: {
         id: objectId,
         token: clientToken
      }
    }).then(response => {
       if(response.data == "verified") return true
       else return false
    })
    .catch(err => {
      return false
    })
}

const update = (req, res) => {
   Promise.coroutine(function*() {
      let verification = yield clientHasRightToEdit(req)
      if(verification == false){
        return res.json({
          "code": "400",
          "message": "Verification failure",
          "body": "You are not allowed to edit this object"
        })
      }else{...}
   })()
}

我在这里缺少什么。 imo返回axios.get应返回一个Promise,它将在yield“继续”之前等待解析。我已经尝试了很多方法(语法方面)来做同样的但是有相同的错误。

换句话说,我在这里搞砸了语法还是谷歌特有的东西在这里我不知道?

谢谢!

1 个答案:

答案 0 :(得分:0)

时间解决了这个问题。

今天我编写了2个非常简单的云函数:1)父2)使用 axios 在父级中调用Child的子项。

我在问题中使用了相同的Promise和yield方法(和语法),它似乎立即起作用。

感到困惑我回到原始代码,它在之前的部署中起作用。

它似乎很难启动(我上次给它一个小时),但今天已经过了12个。

摘要:

  1. 使用axios调用其他云功能没有问题。
  2. 此语法很好
  3. 部署需要的时间超出预期 (这次超过一个小时)锻炼身体。我怀疑这是一个例外,不是常态。
  4. 云功能仍处于测试阶段!
  5. 以下是我的测试功能:

    子:

    //handler
    export const handlerSimple = (req, res) => {
      if (req.method === 'GET') {
        return res.json({
          "code": "200",
          "message": "Success",
          "body": "This is child responding"
        })
      }
    }
    

    父:

    require('dotenv').config()
    var Promise = require('bluebird')
    import axios from 'axios' 
    
    let getChildResponse = (req) =>{
        let childUrl = [CHILD_CF_URI]
        return axios.get(childUrl, {
          }).then(response => {
            return response.data
          })
          .catch(err => {
            return false
          })
    }
    
    //handler
    export const handlerSimple = (req, res) => {
      if (req.method === 'GET') {
        Promise.coroutine(function*() {
          let response = yield getChildResponse(req)
          if(response == false){
            return res.json({
              "code": "400",
              "message": "Error",
              "body": "Axios call to child failed"
            })
          }else{
            return res.json({
              "code": "200",
              "message": "This is parent responding, child in body",
              "body": response
            })
          }
        })()
      }
    }