百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

JavaScript访问mysql,原来如此简单

suiw9 2025-04-05 22:27 6 浏览 0 评论

  • 你对JS的了解,是否还停留在jquery?来访问数据库试试吧,做全栈是如此的简单~!
  • JS访问mysql的工具类,大致需求如下:1, 单实例,避免数据库链接浪费。2,连接池功能。3,链接检测。4,提供简单查询和执行的方法,支持异步和同步(返回对象是Promise)。

我会看着你调试代码呢

  • JavaScript的骨子里面就是简单、优雅、灵活、精致。访问数据库也是如此。


想的越少,做的越快

  • JavaScript方法封装应该都使用Promise返回,首先是封装了catch异常,更重要的是这样可以任由使用者来决定是同步调用还是异步调用,等于一份代码支持两种场景。

支持一个好,还是支持两个好?

  • 如果有更好的建议,请及时提出指正一起进步哈

// 使用mysql2的  promise包,能更好的适应 同步和异步处理
const mysql = require('mysql2/promise');
// 读取mysql配置,可以先忽略,自行定义即可
var dbbooks = require('../config').db.books

class Db{
    static getInstance(){ //1、单例 多次实例化实例不共享的问题
        if(!Db.instance){
            Db.instance = new Db()
            Db.instance.connect()     /*实例化的时候就连接数据库*/
        }
        return Db.instance;
    }
    constructor(){
        //创建pool, 这个时候不会链接数据库,有需要的时候才链接
        this.pool = mysql.createPool({
            host: dbbooks.host,
            user: dbbooks.username,
            port: dbbooks.port,
            password: dbbooks.password,
            database: dbbooks.database,
            waitForConnections: true,
            connectionLimit: 10,
            queueLimit: 0
          })
    }
    /**
     * 链接数据库
     */
    connect(){
        //测试是否通畅
        this.query('select 1').then(()=>{
            console.log('mysql connected', dbbooks)
        }).catch(()=>{
            console.log('mysql connect fail', dbbooks)
        })
    }

    //  每一个对外公开的方法,都应该尽可能写成Promise,
    //   这样由使用者来决定是同步调用还是异步调用,
    //   而且promise自带对异常的处理,代码更安全。
    
    /**
     * 查询
     * @param {string} sql 
     * @param {Array} param 
     * @returns 
     */
    async query(sql, param){
        return new Promise((resolve, reject) => {
            this.pool.query(sql, param).then((results)=>{
                resolve(results[0])
            }).catch((err)=>{
                reject(err);
            })
        });
    }

    /**
     * 查询只返回一个对象,如果查询不到,返回 {}
     * @param {string} sql 
     * @param {Array} param 
     * @returns 
     */
    async queryOne(sql, param){
        return new Promise((resolve, reject) => {
            this.pool.query(sql, param).then((results)=>{
                // console.log('resutls', results)
                if(results[0].length>=1){
                    resolve(results[0][0])
                }else{
                    resolve({})
                }
            }).catch((err)=>{
                reject(err);
            })
        });
    }
  
    /**
     * 执行新增,修改,删除的sql。也可以执行查询sql
     * @param {string} sql 
     * @param {array} param 
     * @returns 
     */
    async execute(sql, param){
        return new Promise((resolve, reject) => {
            this.pool.execute(sql, param).then((results)=>{
                // console.log(results, '---', fields)
                resolve(results[0]) 
            }).catch((err)=>{
                reject(err);
            })
        });
    }

}
// 这里, Db.getInstance() 每次返回的是同一个对象,以此实现单例调用
module.exports = Db.getInstance()
  • 测试代码
var db = require('../db/mysql')
// 同步调用
const testbook = async ()=>{
  return await db.query('select * from books  where status=0  order by views desc');
}
testbook().then((data)=>{
    console.log(data)
}).catch((err)=>{
	 console.log(err)
})

//或者是 异步调用
db.query('select * from books  where status=0  order by views desc').then((data)=>{
    console.log(data)
}).catch((err)=>{
	 console.log(err)
})
  • 同步和异步调用的区别在于,你是否决定马上处理异常(then,catch),还是以后再说(同步await执行)。

你是最靓的仔,你来决定什么时候执行

  • 关注老胡,带来更多简单优雅的代码。

相关推荐

JQuery ajax jsonp 跨域理解(jquery的jsonp方式跨域请求)

1、先来两个jsonp的写法看看//简写形式$.getJSON("http://app.example.com/base/json.do?sid=1494&busiId=101&jsonpCallba...

谷歌测试双指操作"饼状菜单"

3月18日,据科技博客网站phoneArena报道,Google最近向美国专利和商标局提交了与带有饼图状菜单的用户界面相关的专利申请文件,表明它在开发带有饼图状菜单的触控设备用户界面。Google新开...

10 招让 Google Keep 化身超强助理

GoogleKeep虽然目前只能在网页版、Android等平台上使用,但已经成为不少朋友爱用的笔记、备忘录,甚至简单的任务管理服务,在电脑玩物中就常常有朋友跟我分享他们的GoogleKeep...

Android中高级进阶开发面试题冲刺合集(九)「完结篇」

以下主要针对往期收录的面试题进行一个分类归纳整理,方便统一回顾和参考。本篇是第九集...

跨平台移动开发利器Xamarin Studio发布v5.10.2

XamarinStudio是跨平台移动开发(IDE)利器。XamarinStudio是一个开发效率很高的移动开发工具,开发者可以轻松查看iOS、Android和OSXAPIs,快速查询类型、方...

APP切图的基本元素的设计(app图标切图是多大尺寸)

切图是个技术活,小伙伴们千万不能忽视切图的重要性噢,快来看一下7大基本元素的设计吧。1、按钮的设计你可以真正点击的区域应该尽量大些,至少不应该小于一个手指的宽度,那样的话点击的命中率要高,否则会有“点...

Android Studio下载与安装(android studio完整安装教程)

AndroidStudio简介AndroidStudio是由Google打造和发布的用于开发Android应用的官方集成开发环境(IDE)。软件开发者可利用IDE中的工具为And...

桌面端和移动端的设计差异性(桌面端和移动端的设计差异性是什么)

编辑导语:设计师在面对不同的界面设计时,会有一定的差异性,虽然是一个页面,但是移动端和桌面端也有很大的区别,比如控件和试图都会不一样;本文作者分享了关于桌面端和移动端的设计差异性,我们一起来了解一下。...

用户界面干货盘点(用户界面干货盘点怎么做)

首先恭祝各位小伙伴们新年快乐!2016年更上一层楼!本周,我们预测了2016年仍会持续火热的5大UI/UX设计趋势,盘点了2015年值得关注的8款跨平台开发工具(界面类),倾情奉上(25集全)DevE...

为偏执的你准备的5款安卓加密工具

ZD至顶网CIO与应用频道09月28日专栏:你是否担心会有人监视着你?如果是的话,安卓生态系统提供了大量缓解你这一偏执的应用。但是那款应用是必备的选择?以下是5款你应该立即安装并且投入使用的应用...

Flet 开发 App ,相同代码 自动适配 iOS 和 Android ,呈现不同外观UI

我们知道,苹果iOS和安卓Android的UI风格是不同的,各有特色。而Flet开发的App是可以多平台运行的,如何让Flet开发的App,在苹果手机上运行时是“iOS风格”,...

JetBrains TeamCity:为Android开发项目构建和管理详细CI/CD管道

...

android上的markdown软件比较(安卓好用的markdown)

软件名|大屏幕|表格支持|工具图标|导出PDF|导入导出-----|-----|----|-----|---|---markor|v|长按短按添加|v好|v|v|markdownx|x|输入行...

SpringBoot+MyBatis+Druid监控SQL的运行情况

今天想和大家聊一聊Druid中的监控功能。...

JavaScript需要掌握的技能盘点(JS入门需看)

JavaScript是当今使用的最重要的Web开发语言之一。它使您可以为您的网站添加广泛的功能特性,从最基本得到最高级的。因此,无论您是专家级开发人员还是刚起步的初学者,您都需要了解某些关键的...

取消回复欢迎 发表评论: