是否需要将相同数量的parameter passing到函数中定义的javascript函数中

我可以做一些JavaScript函数的帮助。

下面的代码是一个使用node.js的条带示例,基本上是将代码发回到条带来获取一些用户的详细信息。

app.get('/oauth/callback', function(req, res) { var code = req.query.code; // Make /oauth/token endpoint POST request request.post({ url: TOKEN_URI, form: { grant_type: 'authorization_code', client_id: CLIENT_ID, code: code, client_secret: API_KEY } } }); 

我需要build立一个类似的function,但主要的区别是,我已经有了这个代码,并希望将代码传递给函数。

目前我的function如下所示:

 var getAccountDetails = function(req, res) { // Make /oauth/token endpoint POST request request.post({ url: 'https://connect.stripe.com/oauth/token';, form: { grant_type: 'authorization_code', client_id: 'ca_XXXXXXXXXXXXXXXXXXXXXXXXX', code: code, client_secret: API_KEY } }, function(err, r, body) { }); }; 

我从另一个函数内部调用getAccountDetails(),但是想要传递给getAccountDetails(代码),但是我还是用javascript函数挣扎了一下。

***************更新**************

在谷歌云function控制台我不断收到超时消息。 如果有人看到任何明显错误的代码让我知道。

 function getAccountDetails(code) { console.log(code) return function(req, res) { // Make /oauth/token endpoint POST request request.post({ url: 'https://connect.stripe.com/oauth/token', form: { grant_type: 'authorization_code', client_id: 'xxxxxxxxx', code: code, client_secret: 'xxxxxxxxxxxx' } }, function(err, r, body) { // var accessToken = JSON.parse(body).access_token; console.log(body); }); } } exports.authCode = functions.https.onRequest((req, res) => { console.log(req) var code = req.query.code; console.log(code); getAccountDetails(code) }); 

谢谢。

你的标题问题的简短答案是否定的。 Javascript对于函数定义中的参数个数是否与调用函数时传入的参数个数相匹配非常灵活。

处理不同数量的参数是这样处理的:

  • 如果函数的调用次数less于定义中的调用次数,那么未包含的参数将在函数执行中undefined
  • 如果一个函数的调用比定义中的参数多,那么多余的参数不会引起任何问题

实际上,在第二种情况下,仍然可以访问使用arguments关键字传递的额外参数:

 function example(p1, p2) { console.log(arguments[2]); } example('one', 'two', 'three'); // logs: 'three' 

但是,您正在使用的function看起来可能是框架的一部分。 如何使用它取决于什么框架,以及它在哪里。

您可以修改函数定义:

 var getAccountDetails = function(req, res, code) { // ... 

只要框架的其他部分没有调用该函数,就可以了,可能期望在第三个参数中还有别的东西可以存在(例如,许多基于expression式的应用程序可能期望第三个参数是一个callback函数,经常标注next等)。

作为一个最好的猜测,如果你创build了这个函数作为帮手,或者为自己服务,那么我会说,根据需要修改它,并做实验。 但是,如果它是一个框架的高度结构化的部分,修改它可能会破坏一些东西。

尝试这个:

 exports.authCode = functions.https.onRequest((req, res) => { console.log(req) var code = req.query.code; console.log(code); getAccountDetails(code)(req, res); }); 

getAccountDetails(code)正在返回一个Function (req, res) ,所以你只需要用reqres来调用那个函数。 既然你没有真的调用这个函数,什么都没有发生 – 你没有做任何事情,所以它是超时的。

在JavaScript中,一个函数(A)可以返回另一个函数(B)。 返回的函数B可以记住函数A被调用的任何东西。 这被称为closures。 所以

 function getAccoudnDetailsWith(code) { return function (req, res) { //this function is stored in getAccountDetails request.post({ url: 'https://connect.stripe.com/oauth/token', form: { grant_type: 'authorization_code', client_id: 'ca_XXXXXXXXXXXXXXXXXXXXXXXXX', code: code,///this code is whatever you pass in client_secret: API_KEY } }, function (err, r, body) { }); } } var getAccountDetails = getAccoudnDetailsWith(code); 

编辑1:你不需要从你改变的代码closures。

 exports.authCode = functions.https.onRequest((req, res) => { var code = req.query.code; // Make /oauth/token endpoint POST request request.post({ url: TOKEN_URI, form: { grant_type: 'authorization_code', client_id: CLIENT_ID, code: code, client_secret: API_KEY } }, function(err, r, body) { // var accessToken = JSON.parse(body).access_token; console.log(body); }); });