Как запросить Google Cloud Function (CF) из другого CF? - PullRequest
0 голосов
/ 02 июня 2018

Я пытаюсь вызвать облачную функцию Google (CF) с axios из другого 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 returning axios.get должен вернуть Обещание, которое будет ждать разрешения, прежде чем доходность "продолжится".Я пробовал много способов (по синтаксису) сделать то же самое, но с той же ошибкой.

Другими словами, я не ошибся с синтаксисом здесь или есть что-то специфическое для Google здесь, о котором я не знаю?

Спасибо!

1 Ответ

0 голосов
/ 03 июня 2018

Время решило эту проблему.

Сегодня я написал 2 очень простых облачных функции: 1) Родитель 2) Ребенок с родителем, вызывающий ребенка в обработчике с использованием axios .

Я использовал тот же подход Promise и 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
        })
      }
    })()
  }
}
...