如何使用Node.js生成未在数据库中存在的随机ID
问题原因分析
- 原代码中的do-while是同步执行逻辑,不会等待内部匿名async函数的SQL查询完成,循环会持续空转,
repeat变量无法及时获取到查询结果更新 id变量定义在do代码块的局部作用域中,块外的console.log无法访问该变量- 直接拼接SQL字符串存在SQL注入风险,不符合安全规范
正确实现代码
const util = require('util'); const sql = require('../sqlconnection.js'); // promisify数据库查询方法 const query = util.promisify(sql.query).bind(sql); // 把生成唯一ID逻辑封装为异步函数 async function generateUniqueId(length = 50) { let repeat = false; let id; do { id = createId(length); // 等待查询完成再判断是否需要重新生成 // 使用参数化查询避免SQL注入风险 const rows = await query('SELECT id FROM users WHERE id = ?', [id]); repeat = rows.length > 0; } while (repeat); return id; } // 常规调用方式 generateUniqueId().then(uniqueId => { console.log(uniqueId); // 后续使用唯一ID的逻辑写在这里 }).catch(err => { // 处理数据库查询异常 console.error('生成唯一ID失败:', err); });
调用补充说明
如果你的Node.js版本 >= 14.8,支持顶层await特性,可以简化调用写法:
const uniqueId = await generateUniqueId(); console.log(uniqueId);
注意事项
- 请确保
createId函数已提前正确定义/引入,逻辑和PHP版本中生成随机字符串的规则一致 - 所有异步数据库操作必须添加
await关键字等待执行完成,才能获取正确的结果做判断 - 生产环境请务必使用参数化查询,避免SQL注入漏洞
内容的提问来源于stack exchange,提问作者Masandy Hariyanto
相关产品推荐
相关产品推荐

