从app.js向choices.js传递数据的最优方案?当前answer变量用法是否合理?
从app.js向choices.js传递信息的最佳实践
你现在通过将数据存入choicesTerm数组,再通过Express的/choices-api接口返回给前端choices.js的方式,其实是前后端分离场景下非常标准且合理的做法,不过我们可以从代码健壮性、可维护性等角度优化这个实现。
现有方案的合理性
- 这种通过API接口异步获取数据的方式,完美契合前后端分离的架构设计,前端和后端解耦,各自聚焦自身职责(后端处理数据库逻辑,前端负责页面渲染与交互)
- 使用
res.json()返回JSON格式数据,前端用$.getJSON()接收,是通用且成熟的前后端数据交互模式
可优化的方向
1. 重构嵌套回调,避免“回调地狱”
你当前的数据库调用采用嵌套回调的写法,当逻辑复杂时会变得难以阅读和维护。建议改用Promise或async/await来重构:
// 重构后的数据库调用示例 sql.open(connStr) .then(conn => conn.procedureMgr()) .then(pm => pm.callproc('mySP', sessionID)) .then(() => pm.callproc('mySp2')) .then(results => { if (results.length) { const row = results[0]; const answers = row.Answers.split("|"); // 用map替代for循环,更简洁 choicesTerm = answers.map(ans => ({ value: ans, description: ans, question: row.text, detail: row.detail })); } }) .catch(err => { console.error('数据库调用出错:', err); });
2. 处理数据未就绪的边界情况
当前如果前端在数据库查询完成前请求/choices-api,会拿到空数组。可以通过两种方式优化:
- 等待数据库查询完成后再启动Express服务,确保接口返回有效数据
- 在接口中判断数据状态,返回合适的HTTP状态码(比如
503 Service Unavailable),前端可以实现重试逻辑
3. 优化数据结构,减少冗余
你现在每个answer对象都重复存储了question和detail(所有选项都属于同一个问题的情况下),可以调整数据结构来减少冗余:
// 后端返回的优化后结构 const responseData = { question: row.text, detail: row.detail, choices: answers.map(ans => ({value: ans, description: ans})) }; choicesTerm = responseData;
对应的前端choices.js可以更直观地获取数据:
function printTerms(data) { const question = data.question; const detail = data.detail; const choices = data.choices; // 后续渲染逻辑 }
4. 统一变量命名规范
JavaScript中推荐使用驼峰命名法,比如choicesTerm可以改为availableChoices,Answers改为answers,让代码更符合行业通用规范,提升可读性。
总结
你当前的实现思路是完全正确的,已经抓住了前后端数据交互的核心逻辑。如果业务场景简单,现有方案足以满足需求;如果未来业务复杂度提升,按照上面的方向优化后,代码会更健壮、更易于维护。
内容的提问来源于stack exchange,提问作者faujong
相关产品推荐
相关产品推荐

