【问题标题】:How do I get the api_version parameter from a request in node.js?如何从 node.js 中的请求中获取 api_version 参数?
【发布时间】:2019-04-18 01:06:04
【问题描述】:

这是我在 Swift 中发送的请求:

func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock) {
    let url = self.baseURL.appendingPathComponent("ephemeral_keys")
    let params: Parameters = [
        "api_version":apiVersion,
        "uid":Model.shared.uid
        ]
    Alamofire.request(url, method: .post, parameters: params)
        .validate(statusCode: 200..<300)
        .responseJSON { responseJSON in
            switch responseJSON.result {
            case .success(let json):
                completion(json as? [String: AnyObject], nil)
            case .failure(let error):
                completion(nil, error)
            }
    }
}

这是我要执行的云功能。 “api_version”作为参数传递,但 api_version 在 firebase 日志中未定义。如何获取 api_version?我做错了什么?

const functions = require('firebase-functions');
const admin = require('firebase-admin');
const stripe = require('stripe')("sk_test_...");

stripe.setApiVersion('2018-11-08');

admin.initializeApp(functions.config().firebase);

exports.ephemeral_keys = functions.https.onRequest((req, res) => {
  const stripe_version = req.api_version;
  if (!stripe_version) {
    console.log('error with stripe version')
    console.log(stripe_version)
    res.status(400).end();
    return;
  }
  const uid = req.params.uid;
  const user = admin.firestore().collection('users').doc(uid);
  console.log('Customer id ' + user.customerId);

  stripe.ephemeralKeys.create(
    {customer: user.customerId},
    {stripe_version: stripe_version}
  ).then((key) => {
    console.log('Ephemeral key ' + key);
    res.status(200).json(key);
  }).catch((err) => {
    res.status(500).end();
  });
});

【问题讨论】:

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


    【解决方案1】:

    我对 Alamofire 了解不多,但是通过阅读一些关于它和搜索谷歌,你可以做的是:

    选项 1

    最好的约定是使用类似于以下的 URL 来发送您的请求:

    http://server-host-name:<port>/someName/api_version/2.0/getDataApi
    

    在节点服务器端这样做:

    exports.ephemeral_keys = functions.https.onRequest((req, res) => {
      const stripe_version = req.query.api_version;
      // Do what ever you want with it...
      // ...
    }
    

    选项 2

    使用 api_version 作为查询字符串参数,所以在你的情况下,我认为你做错了,试试这个,在客户端代码中:

     let params: Parameters = [
            "api_version":apiVersion,
            "uid":Model.shared.uid
            ]
        Alamofire.request(url, method: .post,
            parameters: params,
            encoding: URLEncoding(destination: .queryString))
    

    这是为了告诉 Alamofire 将参数编码为查询字符串参数(更多信息请阅读this Stackoverflow post

    选项 3

    或者将 api 版本放在自定义 HTTP 标头中,如下所示:

    let headers: HTTPHeaders = [
      "api_version": MY_API_KEY,
      "Accept": "application/json"
    ]
    
    Alamofire.request(yourURL, headers: headers)
      .responseJSON { response in
      debugPrint(response)
    }
    

    并尝试像这样在节点服务器端提取它:

    const stripe_version = req.headers.api_version;
    

    顺便说一句,我最好的选择是选项 1(最符合 REST API 约定)

    (未测试) 检查并告诉我们这是否适合您!

    【讨论】:

      猜你喜欢
      • 2017-05-09
      • 2013-05-20
      • 1970-01-01
      • 2013-11-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      • 2019-11-26
      • 2019-10-10
      相关资源
      最近更新 更多