【问题标题】:How to get parameters from request in cloud functions? Firebase如何从云函数中的请求中获取参数?火力基地
【发布时间】:2017-12-14 14:14:55
【问题描述】:

我制作了 https 云函数,并使用 iOS 应用程序向它发出请求。调用 Cloud 函数,因为我可以看到日志,但我无法从我从 iOS 应用程序发送的请求中获取参数。我尝试了几种不同的选择,但它们对我有所帮助,请告诉我如何才能达到结果?

const functions = require('firebase-functions');
const admin = require('firebase-admin');

module.exports = functions.https.onRequest((req, res) => {
    console.log("getChatGroupConversationAvatars start", req.params);
    const requestDict = req.params;
    console.log("requestDict", requestDict);
    const queryFormat = req.query.format;
    console.log("queryFormat", queryFormat);
    const conversationID = requestDict["conversationID"];
    const currentUserID = requestDict["currentUserID"];

    console.log("conversationID", conversationID, "currentUserID", currentUserID);

    return console.log("getChatGroupConversationAvatars");
});

iOS 应用代码

class ChatAvatarsManager {

    func getChatGroupConversationAvatars(_ conversationID: String) {
        DispatchQueue.main.async {
            guard let currentUserID = RealmManager().getCurrentUser()?.id else { return }
            DispatchQueue.global(qos: .background).async {
                let path = "https://us-central1-exampleapp.cloudfunctions.net/getChatGroupConversationAvatars"
                guard let url = URL(string: path) else { return }
                let parameters = ["conversationID" : conversationID, "currentUserID" : currentUserID]
                AlamofireExampleManager.shared.request(url, method: .get, parameters: parameters, encoding: URLEncoding.default, headers: nil).responseJSON { (response) in
                    switch response.result {
                    case .success:
                        debugPrint("getChatGroupConversationAvatars success")
                    case .failure(let error):
                        if error._code == NSURLErrorTimedOut {
                            //timeout here
                            debugPrint("getChatGroupConversationAvatars timeOut")
                        }
                        debugPrint("getChatGroupConversationAvatars \(error)")
                    }
                }
            }
        }
    }

}

struct AlamofireExampleManager {

    static let shared: SessionManager = {
        let configuration = URLSessionConfiguration.default
        configuration.timeoutIntervalForRequest = 10
        let sessionManager = Alamofire.SessionManager(configuration: configuration)
        return sessionManager
    }()

例如我在日志中得到了这个结果

conversationID undefined currentUserID undefined

我也试过了

module.exports = functions.https.onRequest((req, res) => {

    const conversationID = req.params.conversationID;
    const currentUserID = req.params.currentUserID;

    console.log("conversationID", conversationID, "currentUserID", currentUserID);

    return console.log("getChatGroupConversationAvatars");
});

【问题讨论】:

    标签: ios node.js firebase google-cloud-platform google-cloud-functions


    【解决方案1】:
    [[[FIRFunctions functions] HTTPSCallableWithName:@"functionName"] callWithObject:@{@"key": value}
                                                                  completion:^(FIRHTTPSCallableResult * _Nullable result, NSError * _Nullable error) { 
    

    iOS 将数据放入 request.body.data.key 中,因此如果您在查询中查找来自 iOS 的传入数据,那么您正在寻找错误的地方伙伴。当您在 url 中使用 ?key=value 参数从浏览器调用该函数时,request.query.key 具有数据。但是当从应用程序调用时,传递的数据在 request.body.data 对象中 - 我检查了 iOS SDK 的源代码,是的,这就是它的实现方式。

    【讨论】:

      【解决方案2】:

      对于 Web:(POST 请求)

      我们有:

      export const myFunction = functions.https.onRequest((req, res) => {
      
          const conversationID = req.body.conversationID;
          const currentUserID = req.body.currentUserID;
      
       return ;
      });
      

      参考:Firestore Read From Values

      【讨论】:

      • 感谢帮助!另请注意,默认情况下调用 httpsCallable 会将参数放入名为 data 的 json 对象中,因此我必须执行 req.body.data.conversationID
      【解决方案3】:

      我读了这个post 并重写了我的代码,所以它对我有用。

      const functions = require('firebase-functions');
      const admin = require('firebase-admin');
      
      module.exports = functions.https.onRequest((req, res) => {
      
          const conversationID = req.query.conversationID;
          const currentUserID = req.query.currentUserID;
      
          console.log("conversationID", conversationID, "currentUserID", currentUserID);
      
          return console.log("getChatGroupConversationAvatars");
      });
      

      【讨论】:

      • 我不得不把那个家伙包裹在一个 cors(request, response, () => {} 中,我已经准备好了。谢谢!
      猜你喜欢
      • 2021-07-09
      • 2019-01-24
      • 1970-01-01
      • 2016-09-17
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 2016-10-16
      • 2017-07-14
      相关资源
      最近更新 更多