You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Node.js项目connected模块导出的invoiceNumberQuery无法更新问题

问题根因

Node.js 采用的 CommonJS 模块规范中,原始类型(数字、字符串、布尔等)的导出是值拷贝。你在connected.js里导出invoiceNumberQuery的时候,只是把初始值0复制了一份放到导出对象里,后续你修改模块内部的invoiceNumberQuery变量,不会同步更新到导出对象上,所以其他模块引入拿到的永远是初始的0。


修复方案

方案1:直接修改导出对象的属性(快速修复)

直接把变量挂在导出对象上修改,因为导出对象是引用类型,修改其属性会同步到所有引入的位置:

// connected.js 调整后的代码
var tools = require('../tools/tools.js')
var https = require('https')
var url = require('url')
var express = require('express')
var router = express.Router()

// 先定义导出对象,把初始值挂在导出对象属性上
module.exports = {
  router:router,
  invoiceNumberQuery: 0
}

router.get('/', function (req, res) {
  var token = tools.getToken(req.session)
  var invoiceNumber = req.query.invoice;
  // 直接修改导出对象的属性,外部可以拿到最新值
  module.exports.invoiceNumberQuery = invoiceNumber;
  // 后续原有逻辑保持不变
  if(!token) return res.redirect('/')
  // ...剩余代码不用修改
})

apiCall.js的原有逻辑不需要调整。


方案2:存储到Session(更稳妥的业务级方案)

你当前用模块全局变量存用户参数,多用户同时访问时会出现数据互相覆盖的并发问题,建议直接把参数存在用户独立的session中,天然隔离用户数据:

  1. 调整connected.js的存储逻辑:
router.get('/', function (req, res) {
  var token = tools.getToken(req.session)
  var invoiceNumber = req.query.invoice;
  // 存到当前用户的session中,不会和其他用户冲突
  req.session.invoiceNumberQuery = invoiceNumber;
  // 后续原有逻辑保持不变
})
  1. 调整apiCall.js的取值逻辑,不需要再引入connected.js:
router.get('/', function (req, res) {
  var token = tools.getToken(req.session)
  if(!token) return res.json({error: 'Not authorized'})
  if(!req.session.realmId) return res.json({
    error: 'No realm ID.  QBO calls only work if the accounting scope was passed!'
  })
  
  // 直接从当前用户session取参数
  const number = req.session.invoiceNumberQuery || 0
  var url = config.api_uri + req.session.realmId + "/query?query=select * from Invoice where docNumber = " + "'" + number + "'" + "&minorversion=59"
  // 后续原有逻辑保持不变
})

内容的提问来源于stack exchange,提问作者Marcus Martin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 09:15:03