Node.js如何对SQLite的async/await封装详解


Posted in Javascript onFebruary 14, 2019

前言

本文主要给大家介绍的是关于Node.js对SQLite的async/await封装的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧

用于将每个SQLite函数同步化,并可以用await的接口。

注意:需要SQLite for Node模块和Node.js 8.0+,并支持async / await。

SQLite最常用作本地或移动应用程序的存储单元,当需要从程序的各个部分访问数据时,回调不是最佳解决方案。

为了在程序程序中更自然地访问数据,我编写了一个将回调转换为promises的接口,因此我们可以将每个函数与await关键字一起使用。 它不是异步函数的替代品,它是一个补充,可以将原始函数和同步函数一起使用。

aa-sqlite模块

SQLite的接口是一个名为aa-sqlite的模块,您必须将其存储在应用程序的node_modules部分中。这是完整的源代码

const sqlite3 = require('sqlite3').verbose()
var db
 
exports.db = db
 
exports.open=function(path) {
 return new Promise(function(resolve) {
 this.db = new sqlite3.Database(path,
  function(err) {
   if(err) reject("Open error: "+ err.message)
   else resolve(path + " opened")
  }
 ) 
 })
}
 
// any query: insert/delete/update
exports.run=function(query) {
 return new Promise(function(resolve, reject) {
  this.db.run(query,
   function(err) {
    if(err) reject(err.message)
    else resolve(true)
  })
 }) 
}
 
// first row read
exports.get=function(query, params) {
 return new Promise(function(resolve, reject) {
  this.db.get(query, params, function(err, row) {
   if(err) reject("Read error: " + err.message)
   else {
    resolve(row)
   }
  })
 })
}
 
// set of rows read
exports.all=function(query, params) {
 return new Promise(function(resolve, reject) {
  if(params == undefined) params=[]
 
  this.db.all(query, params, function(err, rows) {
   if(err) reject("Read error: " + err.message)
   else {
    resolve(rows)
   }
  })
 })
}
 
// each row returned one by one
exports.each=function(query, params, action) {
 return new Promise(function(resolve, reject) {
  var db = this.db
  db.serialize(function() {
   db.each(query, params, function(err, row) {
    if(err) reject("Read error: " + err.message)
    else {
     if(row) {
      action(row)
     } 
    }
   })
   db.get("", function(err, row) {
    resolve(true)
   })   
  })
 })
}
 
exports.close=function() {
 return new Promise(function(resolve, reject) {
  this.db.close()
  resolve(true)
 })
}

使用示例

下面的示例展示了aa-sqlite的每个功能的示例。在第一部分中,我们打开一个数据库,添加一个表并用一些行填充该表。然后关闭数据库,我们再次打开它并执行一些同步查询。

const fs = require("fs")
const sqlite = require("aa-sqlite")
 
async function mainApp() {
  
 console.log(await sqlite.open('./users.db'))
  
 // Adds a table
  
 var r = await sqlite.run('CREATE TABLE users(ID integer NOT NULL PRIMARY KEY, name text, city text)')
 if(r) console.log("Table created")
 
 // Fills the table
  
 let users = {
  "Naomi": "chicago",
  "Julia": "Frisco",
  "Amy": "New York",
  "Scarlett": "Austin",
  "Amy": "Seattle"
 }
  
 var id = 1
 for(var x in users) {
  var entry = `'${id}','${x}','${users[x]}'`
  var sql = "INSERT INTO users(ID, name, city) VALUES (" + entry + ")"
  r = await sqlite.run(sql)
  if(r) console.log("Inserted.")
  id++  
 }
 
 // Starting a new cycle to access the data
 
 await sqlite.close();
 await sqlite.open('./users.db')
 
 console.log("Select one user:")
  
 var sql = "SELECT ID, name, city FROM users WHERE name='Naomi'"
 r = await sqlite.get(sql)
 console.log("Read:", r.ID, r.name, r.city)
  
 console.log("Get all users:")
  
 sql = "SELECT * FROM users"
 r = await sqlite.all(sql, [])
 r.forEach(function(row) {
  console.log("Read:", row.ID, row.name, row.city) 
 })
  
 console.log("Get some users:")
  
 sql = "SELECT * FROM users WHERE name=?"
 r = await sqlite.all(sql, ['Amy'])
 r.forEach(function(row) {
  console.log("Read:", row.ID, row.name, row.city) 
 })
 
 console.log("One by one:")
  
 sql = "SELECT * FROM users"
 r = await sqlite.each(sql, [], function(row) {
  console.log("Read:", row.ID, row.name, row.city) 
 })
 
 if(r) console.log("Done.")
 
 sqlite.close();
}
 
try {
 fs.unlinkSync("./users.db")
}
catch(e) {
}
 
mainApp()

由于all方法返回一个row数组,我们使用forEach来处理每一行的内容。

你可以在每个方法的情况下进行验证,即在程序显示“完成”之前处理返回的每一行。原始异步方法不会出现这种情况。

参考并翻译自:https://www.scriptol.com/sql/sqlite-async-await.php

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
javascript jscroll模拟html元素滚动条
Dec 18 Javascript
javascript改变position值实现菜单滚动至顶部后固定
Jan 18 Javascript
jquery 卷帘效果实现代码(不同方向)
Feb 05 Javascript
IE下window.onresize 多次调用与死循环bug处理方法介绍
Nov 12 Javascript
IE与FireFox的JavaScript兼容问题解决办法
Dec 31 Javascript
jquery 动态增加删除行的简单实例(推荐)
Oct 12 Javascript
利用jQuery异步上传文件的插件用法详解
Jul 19 jQuery
详谈构造函数加括号与不加括号的区别
Oct 26 Javascript
jQuery封装animate.css的实例
Jan 04 jQuery
JS运动特效之完美运动框架实例分析
Jan 24 Javascript
深入理解js 中async 函数的含义和用法
May 13 Javascript
vue element-ui el-date-picker限制选择时间为当天之前的代码
Nov 07 Javascript
VuePress 静态网站生成方法步骤
Feb 14 #Javascript
extract-text-webpack-plugin用法详解
Feb 14 #Javascript
JavaScript"模拟事件"的注意要点详解
Feb 13 #Javascript
快速了解Node中的Stream流是什么
Feb 13 #Javascript
vue2.0+vue-router构建一个简单的列表页的示例代码
Feb 13 #Javascript
vue实现点击隐藏与显示实例分享
Feb 13 #Javascript
JS+canvas画布实现炫酷的旋转星空效果示例
Feb 13 #Javascript
You might like
为什么那些咖啡爱好者大多看不上连锁咖啡店?
2021/03/06 咖啡文化
163的邮件用phpmailer发送(实例详解)
2013/06/24 PHP
PHP FTP操作类代码( 上传、拷贝、移动、删除文件/创建目录)
2014/05/10 PHP
随机显示经典句子或诗歌的javascript脚本
2007/08/04 Javascript
js 单引号 传递方法
2009/06/22 Javascript
jquery.fileEveryWhere.js 一个跨浏览器的file显示插件
2011/10/24 Javascript
Jquery实现三层遍历删除功能代码
2013/04/23 Javascript
js中通过split函数分割字符串成数组小例子
2013/09/21 Javascript
jquery弹窗插件colorbox绑定动态生成元素的方法
2014/06/20 Javascript
JS实现鼠标滑过链接改变网页背景颜色的方法
2015/10/20 Javascript
以WordPress为例讲解jQuery美化页面Title的方法
2016/05/23 Javascript
JavaScript接口的实现三种方式(推荐)
2016/06/14 Javascript
全面理解闭包机制
2016/07/11 Javascript
Vue.js第四天学习笔记
2016/12/02 Javascript
利用prop-types第三方库对组件的props中的变量进行类型检测
2017/05/02 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
原生js实现淘宝放大镜效果
2020/10/28 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
Python使用while循环花式打印乘法表
2019/01/28 Python
python的依赖管理的实现
2019/05/14 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python collections模块使用方法详解
2019/08/28 Python
Windows10下 python3.7 安装 facenet的教程
2019/09/10 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
使用Pycharm分段执行代码
2020/04/15 Python
如何在Python3中使用telnetlib模块连接网络设备
2020/09/21 Python
jupyter notebook 写代码自动补全的实现
2020/11/02 Python
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
家长寄语大全
2014/04/02 职场文书
经典演讲稿汇总
2014/05/19 职场文书
建筑工地质量标语
2014/06/12 职场文书
锅炉工岗位职责
2015/02/13 职场文书
总经理司机岗位职责
2015/04/10 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
MySQL中存储时间的最佳实践指南
2021/07/01 MySQL
sql时间段切分实现每隔x分钟出一份高速门架车流量
2022/02/28 SQL Server