nodeJS 如何使用knex同步获取数据?

问题概述

最近在用Electron+Vue做一个小软件,集成了SQLite,数据库层用的knex,将常用的方法写在了DbUtils.js里
需求:在Vue组件里调用DbUtils的方法,获取数据库查询出来的数据
问题:knex里好像用的是promise,等Vue组件里的非异步的代码执行完了,才查出来数据,那么在组件里是获取不到数据的

代码分析

项目gitee地址:TimeRecorder

在DbUtils.js有一个查询数据的方法

//返回labelTable的所有值
function returnLabelTableData_test() {
    var data
    knex.select("*").from('labelTable').then((rows) => {
        data = rows
        rows.forEach(row => {
            console.log(`${row['ID']} ${row['recordDate']}  ${row['beginTime']} ${row['endTime']}  ${row['firstLabel']} ${row['secondLabel']}  ${row['timeNote']}`);
        });
    })
    .catch((err) => { console.log(err); throw err })
    .finally(() => {
        knex.destroy();
    });
    return data //返回labelData里的所有数据
}

在TRRecord.vue里引入DbUtils,调用方法:

loadLabels(){
      var data = DbUtils.getLabelTableData()
      console.log('loadLabels',data)   //输出是undefined
    },

尝试的解决措施

用promise的async和await,testDbutl.js:

async function getLabelTableData(){
    var data = await returnLabelTableData();
    console.log(data);
}

//返回labelTable的所有值
function returnLabelTableData() {
    return knex.select("*").from('labelTable')
}

这样子能正常输出data(数据库里的内容),但是好像会卡死…… 控制台一直不动,只能ctrl+C
本人对于JS才刚入门,看了不少promise的文章,感觉还是有点难懂,对于async和await好像是generator的语法糖? 网上也大致搜索了下,对于knex的文档资料有点少,请问各位有无遇到过这样的需求?

参考资料

Promise 对象 - 阮一峰 ECMAScript 6入门

async 函数 - 阮一峰 ECMAScript 6入门

async await用法,结合promise,将js异步变成同步_yuanyi正的博客-CSDN博客

Knex Query Builder | Knex.js官网文档

StackOverflow:

node.js - Synchronous MySQL query with NodeJS and KnexJS - Stack Overflow

knex.js - How to use Knexjs synchronously on Apollo GraphQL Server - Stack Overflow

阅读 2.9k
1 个回答
  1. Promise 已经是 JS 里的原住民了,而且是地位很高的那种,建议还是好好学一下
  2. Vue 是 MVVM 框架,视图会跟着数据自动更新。换言之,只要你 <template> 没写错,不需要关心数据是什么时候拿到的,只要拿到后更新数据,视图就会自动更新。你不用担心 Vue 里的执行顺序。
  3. Vue2 对数组和对象的监控有一些先天不足,可能会导致数据更新,但是视图没更新,需要注意
  4. async function 严格来说不是语法糖,更不是 generator 的语法糖。用 async function 写异步函数会更容易理解,现在基本也是各运行时原生支持,建议使用。
  5. 卡死的问题我没什么想法,没用过 knex。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题