Node.js 节点并发性/快速请求生命周期/可能的竞争条件?

Node.js 节点并发性/快速请求生命周期/可能的竞争条件?,node.js,asynchronous,express,Node.js,Asynchronous,Express,我正在构建一个多租户节点应用程序,通过查询字符串识别租户 我还有一个API客户端,它根据站点发出经过身份验证(oauth)的请求 我的问题是,我是否可以将API客户机作为一个单例对象保留下来,并且只更新其中的会话——以及在我与客户机进行异步操作时,是否会由于另一个请求同时进入而陷入竞争状态 const session = new Session({ apiKey: 'xxx', secret: 'xxx' }) const client = new Client({ session }) a

我正在构建一个多租户节点应用程序,通过查询字符串识别租户

我还有一个API客户端,它根据站点发出经过身份验证(oauth)的请求

我的问题是,我是否可以将API客户机作为一个单例对象保留下来,并且只更新其中的会话——以及在我与客户机进行异步操作时,是否会由于另一个请求同时进入而陷入竞争状态

const session = new Session({ apiKey: 'xxx', secret: 'xxx' })

const client = new Client({ session })

app.use((req, res, next)=> {
  res.locals.client = client;
  next()
})

app.use((req, res, next)=> {
  let { client, db } = res.locals;
  if (req.query.tenant) {
    return db.Tenant.findOne({ tenant: req.query.tenant })
      .then((tenant)=> {
        client.updateSession({ 
          access_token: tenant ? tenant.access_token : null 
        })
        next()
      })
  }
  next();
})

app.get('/test/api', (req, res)=> {
  let { client } = res.locals;
  client.get('products').then((products)=> {
    // What if another request from another tenant comes in right here?
    // Is it possible for the session to be swapped out underneath me?
    return products.get(2).someAsyncFunc().then((product)=> {
      return res.json(product)
    })
  })
})
我的问题是,我是否可以将API客户机作为一个单例对象保留,并且只更新其中的会话

否,为每个请求创建
客户端
对象的唯一实例。显然
client.updateSession
看起来像是用非共享数据污染了共享对象

换一行就行了

res.locals.client = client;
为此:

res.locals.client = new Client(new Session({apiKey: 'x', secret: 'x'}));

你现在应该安全了。

嗯。。。我确实发现
client.updateSession
可能存在问题。我不知道它是干什么的,所以我不能确定。看起来这绝对是个问题。一个解决方案是为每个请求提供它自己的
客户机
。是的,updateSession只是在客户机实例上设置一个道具。听起来每个请求我都需要一个新实例。谢谢!我的怀疑是我过早地进行了优化,但我只是担心在每次请求时创建新客户机的内存/效率。例如,该客户机下面大约有20个子资源,这些资源是在客户机运行时构建的。