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 变量作用域 两个可能会被忽略的小特性
Mar 23 Javascript
用jquery实现下拉菜单效果的代码
Jul 25 Javascript
JavaScript onkeydown事件入门实例(键盘某个按键被按下)
Oct 17 Javascript
20分钟轻松创建自己的Bootstrap站点
May 12 Javascript
JQuery实现DIV其他动画效果的简单实例
Sep 18 Javascript
详解js数组的完全随机排列算法
Dec 16 Javascript
js使用Replace结合正则替换重复出现的字符串功能示例
Dec 27 Javascript
jquery pagination分页插件使用详解(后台struts2)
Jan 22 Javascript
微信小程序实现跟随菜单效果和循环嵌套加载数据
Nov 21 Javascript
Bootstrap实现下拉菜单多级联动
Nov 23 Javascript
jQuery封装animate.css的实例
Jan 04 jQuery
vue-cli项目代理proxyTable配置exclude的方法
Sep 20 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
判“新”函数:得到今天与明天的秒数
2006/10/09 PHP
PHP mb_convert_encoding 获取字符串编码类型实现代码
2009/04/26 PHP
使用php判断网页是否gzip压缩
2013/06/25 PHP
PHP pear安装配置教程
2016/05/14 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
2016/05/18 PHP
php下载远程大文件(获取远程文件大小)的实例
2017/06/17 PHP
模拟用户操作Input元素,不会触发相应事件
2007/05/11 Javascript
大家未必知道的Js技巧收藏
2008/04/07 Javascript
javascript处理table表格的代码
2010/12/06 Javascript
js报错 Object doesn't support this property or method的原因分析
2011/03/31 Javascript
JS获得URL超链接的参数值实例代码
2013/06/21 Javascript
WebGL利用FBO完成立方体贴图效果完整实例(附demo源码下载)
2016/01/26 Javascript
Angular中响应式表单的三种更新值方法详析
2017/08/22 Javascript
Koa 使用小技巧(小结)
2018/10/22 Javascript
微信小程序实现笑脸评分功能
2018/11/03 Javascript
vue实现分页组件
2020/06/16 Javascript
全局安装 Vue cli3 和 继续使用 Vue-cli2.x操作
2020/09/08 Javascript
vue内置组件keep-alive事件动态缓存实例
2020/10/30 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
Python装饰器如何实现修复过程解析
2020/09/05 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
HTML5网页音乐播放器的示例代码
2017/11/09 HTML / CSS
实例教程 利用html5和css3打造一款创意404页面
2014/10/20 HTML / CSS
HTML5 canvas基本绘图之绘制曲线
2016/06/27 HTML / CSS
EntityManager都有哪些方法
2013/11/01 面试题
建筑公司文秘岗位职责
2013/11/29 职场文书
学生检讨书怎么写
2014/10/09 职场文书
金砖之国观后感
2015/06/11 职场文书
企业宣传稿范文
2015/07/23 职场文书
经销商会议开幕词
2016/03/04 职场文书
《攀登者》:“海拔8000米以上,你不能指望任何人”
2019/11/25 职场文书
Python爬取科目四考试题库的方法实现
2021/03/30 Python
如何解决.cuda()加载用时很长的问题
2021/05/24 Python
Ajax 的初步实现(使用vscode+node.js+express框架)
2021/06/18 Javascript