如何正确获取Knex Select查询返回的数据?
解决Knex select返回Builder对象而非查询数据的问题
嘿,我完全懂你碰到的这个坑!Knex的查询构建器是延迟执行的——你写的knex.select(...).from(...).where(...)只是创建了一个描述查询逻辑的Builder对象,根本没把请求发去数据库。要拿到实际的用户数据,你得主动触发查询执行,毕竟数据库操作都是异步的嘛。
方法1:用Promise .then() 处理异步结果
修改你的函数,让它返回执行查询后的Promise,然后在调用时通过.then()获取真实数据:
function getUserData(userId){ // 在查询链末尾调用.then(),处理数据库返回的结果数组 return knex.select('xp','money','rolls','twenty') .from('users') .where('user_id', userId) .then(rows => { // select查询默认返回数组,取第一个元素(假设user_id是唯一主键) return rows[0]; }); } // 调用函数并处理结果 getUserData(userId).then(user => { console.log(user.xp); // 现在就能正常拿到xp值了 // 在这里写你的业务逻辑 });
方法2:用async/await(更简洁直观)
如果你的项目支持ES8+语法,用async/await能让代码看起来像同步逻辑一样清晰:
// 把函数标记为async async function getUserData(userId){ // 用await等待查询执行完成,拿到结果数组 const rows = await knex.select('xp','money','rolls','twenty') .from('users') .where('user_id', userId); // 返回单个用户对象 return rows[0]; } // 调用时也要在async函数里使用await async function handleUserData() { const user = await getUserData(userId); console.log(user.xp); // 执行你的后续操作 } // 别忘了调用这个async函数 handleUserData();
核心要点提醒
- Knex的查询构建器本身只是个查询蓝图,不会自动执行,必须通过
.then()或await触发数据库请求。 select方法返回的永远是数组,哪怕只匹配到一条记录,所以需要用rows[0]提取单个用户对象(前提是你的user_id是唯一标识)。
内容的提问来源于stack exchange,提问作者The-WebGuy
相关产品推荐
相关产品推荐

