代码之家  ›  专栏  ›  技术社区  ›  KasparTr

如何从另一个cf内部请求google云功能(cf)?

  •  0
  • KasparTr  · 技术社区  · 6 年前

    我试图用 阿西奥斯 从另一个CF里面,但我不断得到 此错误:

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

    我在打电话 update() 从处理程序调用 clientHasRightToEdit 在进行任何数据库更新之前。

    代码如下:

    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{...}
       })()
    }
    

    在package.json中,我声明了Axios依赖项:

    "dependencies": {
        "axios": "^0.16.2",
        "babel-polyfill": "^6.26.0",
        "babel-runtime": "^6.23.0",
        "bluebird": "^3.5.1",
        "dotenv": "^4.0.0",
        "mongodb": "^2.2.31"
      }
    

    我错过了什么。imo返回axios.get时应该返回一个承诺,该承诺将在收益率“继续”之前等待解决。我尝试了很多方法(从语法角度)来做同样的事情,但都有同样的错误。

    换言之,我是搞乱了这里的语法,还是有一些我不知道的谷歌特有的东西?

    谢谢!

    1 回复  |  直到 6 年前
        1
  •  0
  •   KasparTr    6 年前

    时间解决了这个问题。

    今天我编写了两个非常简单的云函数:1)parent 2)child,parent使用 阿西奥斯 .

    我使用了与问题中相同的promise and yield方法(和语法),它似乎很快就起作用了。

    我很困惑地回到了原来的代码,它从以前的部署开始工作。

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

    总结:

    1. 使用axios调用其他云函数没有问题。
    2. 这个语法很好
    3. 部署所需时间超出预期 (这次超过一个小时)去锻炼。我怀疑这是一个例外,不是一个规范。
    4. 云功能还在测试阶段!

    以下是我的测试函数:

    孩子:

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