Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript node.js express,一种非常奇怪的行为_Javascript_Node.js_Express_Cors_Fetch Api - Fatal编程技术网

Javascript node.js express,一种非常奇怪的行为

Javascript node.js express,一种非常奇怪的行为,javascript,node.js,express,cors,fetch-api,Javascript,Node.js,Express,Cors,Fetch Api,我有一台Express服务器正在运行 我要做的是从HTML上传一个Excel文件,然后快速解析该文件并进行一些计算 在Excel文件中,每一行都有关于用户地址的信息 对于每个地址,我们的Express服务器将使用google地图地理编码API计算纬度和经度 但是,因为谷歌每秒不接受超过50个对其地理编码API的请求,所以我不得不使用settimeout来延迟计算 例如,如果Excel文件有50个地址,那么我必须对每个地址使用settimeout来避免该速率限制 这是我使用settimeout和计

我有一台Express服务器正在运行

我要做的是从HTML上传一个Excel文件,然后快速解析该文件并进行一些计算

在Excel文件中,每一行都有关于用户地址的信息

对于每个地址,我们的Express服务器将使用google地图地理编码API计算纬度和经度

但是,因为谷歌每秒不接受超过50个对其地理编码API的请求,所以我不得不使用settimeout来延迟计算

例如,如果Excel文件有50个地址,那么我必须对每个地址使用settimeout来避免该速率限制

这是我使用settimeout和计算纬度、经度的代码

createFromFile(req,res){
var form=new.IncomingForm();
返回form.parse(请求、函数(错误、字段、文件){
如果(错误)
返回res.status(500).json({error:err.message})
var workbook=new exceljs.workbook();
返回workbook.xlsx.readFile(files.excelfile.path){
//使用工作簿
var工作表=工作簿。获取工作表(1)
var数据=[]

对于(var i=2;i而言,您的代码添加到请求中的
访问令牌
请求头会触发浏览器在尝试
POST
请求之前发送CORS飞行前
选项
请求

提供了更多细节,但要点是,只要您的代码将
访问令牌
头添加到请求中,就无法阻止浏览器发出额外的飞行前
选项
请求,因为这是浏览器作为CORS协议的一部分自动执行的操作


当您使用Postman时,您看不到额外请求的原因是它不执行CORS飞行前
选项
仅请求浏览器发送请求,并且仅针对在特定来源的浏览器中运行的XHR/Fetch前端JavaScript代码发出的请求(Postman不是).

好的,最后我可以通过将“访问令牌”传递到请求体而不是请求头来解决这个问题(现在,我的服务器总是只接收一个请求)。感谢@sideshowbarker,因为您的评论触发了我这样做


我仍然认为这个问题是Express中的一个bug,但因为它没有发生在我的本地开发环境中,所以我不会向他们发送报告。

我知道选项请求,但我不明白的是第二个POST请求。请仔细看我随附的屏幕截图,你会看到第二个POST请求。我不明白为什么会出现,因为我只调用了startUploadFile()一次。第二个POST请求与第一个POST请求重叠。因此,在我的情况下,有两个进程在执行此任务。您可能希望使用来编辑/更新您的问题,并添加浏览器devtools中网络窗格显示的内容的日志。如果这表明浏览器实际上发送了两次POST请求,那么Exp中就不会有错误ress.另一方面,如果这没有显示浏览器发送了两次,但是Express处理了浏览器没有发送的第二个POST请求,那么是的,这显然是Express中的一个错误。您是否可能看到两个POST请求,因为第一个来自
startUploadFile()
函数,第二个是默认的表单post(由您从中调用的
startUploadFile()
按钮触发,并由浏览器自动执行)?如果是这样,您需要阻止按钮的默认操作。如果这可能是错误,我们可以通过查看上载的HTML以及如何调用
startupboadfile()
。@jfriend00谢谢,但我不在表单中使用按钮,我只声明一个按钮和一个单击处理程序。startupboadfile()是单击处理程序。由于我的api服务器与此HTML页面的域名不同,如果表单自动提交,它也无法到达我的api服务器。您是否确定了
startupboadfile()
正在被调用一两次?@sideshowbarker在我的chrome网络监控工具中,有两个请求,但第一个是选项请求,第二个是真实的POST请求。没有任何其他POST请求。