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中,天然隔离用户数据:
- 调整
connected.js的存储逻辑:
router.get('/', function (req, res) { var token = tools.getToken(req.session) var invoiceNumber = req.query.invoice; // 存到当前用户的session中,不会和其他用户冲突 req.session.invoiceNumberQuery = invoiceNumber; // 后续原有逻辑保持不变 })
- 调整
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
相关产品推荐
相关产品推荐

