Google apps script 谷歌应用程序脚本:多个用户点击doGet和doPost脚本,变量会混淆吗?
我正在使用GAS文件作为我正在构建的应用程序的服务器端。我定义了doPost(e)和doGet(e)函数,例如:Google apps script 谷歌应用程序脚本:多个用户点击doGet和doPost脚本,变量会混淆吗?,google-apps-script,Google Apps Script,我正在使用GAS文件作为我正在构建的应用程序的服务器端。我定义了doPost(e)和doGet(e)函数,例如: function doPost(e) { var postData = e.postData.contents; var jsonRaw = JSON.parse(postData); var name = jsonRaw.name; // make a long URLFetch call... textOutput
function doPost(e) {
var postData = e.postData.contents;
var jsonRaw = JSON.parse(postData);
var name = jsonRaw.name;
// make a long URLFetch call...
textOutput = ContentService.createTextOutput('execution done for ' + name);
return textOutput
}
我没有在特定函数的作用域之外声明任何“全局”变量。我的问题是,如果我为用户a运行了一个长时间运行的doPost,并且突然用户B也在用户a的请求完成之前发出了一个doPost请求,那么name变量是否可能被重新分配,并且用户a在输出中看到了用户B的名称
根据这里的答案:我相信我应该没事,但我想确认一下。谢谢 也许您应该使用局部变量 局部变量不是共享资源。调用函数时,在函数中定义的变量将属于该函数的作用域。这意味着,如果您有一个在变量中存储参数的函数,则该变量仅对该特定函数的执行有效 全局变量 全局变量当然不同,因为项目中的所有函数都知道它们的值。这些是共享资源,因此如果需要修改它们的值,您可能希望锁定对它们的访问 概念证明 您可以通过创建一个简单的Web应用程序来验证此行为,该应用程序获取一个查询参数,将其存储在一个变量中,并在10秒后返回该参数
function doGet(e) {
var param = e.queryString;
Utilities.sleep(10000);
return ContentService.createTextOutput(param);
}
如果在10秒内使用不同的参数调用此方法,您应该注意到第一个GET
请求返回的值是第二个请求的查询参数。但事实并非如此
工具书类
非常感谢-但我的doPost和doGet需要这样做吗?块作用域变量是否被视为可以同时修改的共享资源?这只是防止多个用户同时运行脚本的一种方法。还要注意的是,谷歌应用程序脚本限制为不超过30个同时使用的用户。感谢您提供的关于30个同时使用的用户的信息,如果我开始这样做,我肯定会选择合适的服务器端提供商。我想我还不清楚我的用例是否需要锁服务?如果代码的另一个实例在前一个实例完成之前开始运行,那么应用程序脚本函数中的变量将被重新分配一个新值。您可以尝试LockService,或者,如果您需要其他选择,Google云功能可以在其独立的安全执行上下文中运行,并自动扩展。您的应用程序脚本代码正在发出HTTPS请求,这可以通过Google云函数HTTP函数完成。谢谢,我应该自己测试一下!但我也希望能从一个对此有更直接经验的人那里听到。我重复了你的测试,得到了相同(不同)的结果。