两个不同的POST请求正在使用相同的变量

时间:2018-12-10 20:39:39

标签: javascript node.js http asynchronous promise

我有一个节点应用程序,该应用程序接收带有多个对象的发布请求以添加到数据库中,并且对于对象,需要发生涉及dropbox api的一系列事情。完成一个对象的全部任务大约需要0.5秒。这意味着,如果我提交30个对象的数组,则可能需要15秒。

两个客户端发布30个对象时,它们的处理将重叠。我在函数中有一个发生这种情况的变量,该变量存储了每种情况下的处理问题。但是,何时发布请求,并且运行重叠,来自两个发布请求的错误都进入相同的issues数组。如何让服务器调用bulkAdd函数的两个单独版本。

bulkAdd: async function (req, callback) {
  issues = []

  await req.reduce((promise, audit) => {
    // return promise.then(_ => dropbox_functions.createFolder(audit.scanner_ui)
    let globalData;
  return promise.then(_ => this.add(audit)
      .then((data)=> {globalData = data; return dropbox_functions.createFolder(data.ui, data)}, (error)=> {issues.push({audit: audit, error: 'There was an error adding this case to the database'}); console.log(error)})
        .then((data)=>{console.log(data, globalData);return dropbox_functions.checkScannerFolderExists(audit.scanner_ui)},(error)=>{issues.push({audit: globalData, error: 'There was an error creating the case folder in dropbox'})})
         .then((data)=>{return dropbox_functions.moveFolder(audit.scanner_ui, globalData.ui)},(error)=>{issues.push({audit: globalData, error: 'No data folder was found so an empty one was created'}); return dropbox_functions.createDataFolder(globalData.ui)})
          .then(()=>console.log(issues))
    );
  }, Promise.resolve()).catch(error => {console.log(error)});
  return(issues)
}, 

1 个答案:

答案 0 :(得分:3)

您的问题与范围和闭包有关:

issues = []

我猜想这个变量是在bulkAdd方法之外声明的。如果不是这样,则在没有varlet关键字的情况下声明它实际上是将变量放在全局范围内。

您需要在本地范围内定义方法的变量:

bulkAdd: async function (req, callback) {
  let issues = [];