Node.js 连接 mysql 数据库

这篇具有很好参考价值的文章主要介绍了Node.js 连接 mysql 数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、安装驱动

二、连接数据库

1、数据库连接的配置信息

数据库连接参数说明

2、封装 mysql 的执行语句

3、后端路由文件 

三、数据库操作( CURD )

1、查询数据

2、插入数据

3、更新数据

4、删除数据

4、获取受影响的行数

5、获取更改的行数

6、多语句查询

7、事务

四、Exception Safety 类型重铸

五、具体操作演示

入口文件

后端路由文件

数据库配置文件 

封装 mysql 查询函数

启动项目

六、查看数据库

七、调用接口

参考文档


一、安装驱动

npm install mysql
npm install --save mysql2

mysql的兼容升级npm包mysql2,mysql2兼容mysql的api语法。

使用起来没有太大的差别,但是mysql2在性能上面提升很大。

 

二、连接数据库

1、数据库连接的配置信息

// db.config.js

// 数据库连接配置
module.exports = {
	mysql: {
		host: 'localhost', // 主机地址 (默认:localhost)
		user: 'root', // 数据库用户名
		password: 'root', // 数据库密码
		database: 'schoolmarket', // 数据库名
		port: '3306' // 端口号 (默认:3306)
	}
}

数据库连接参数说明

参数 描述
host 主机地址 (默认:localhost)
  user 用户名
  password 密码
  port 端口号 (默认:3306)
  database 数据库名
  charset 连接字符集(默认:'UTF8_GENERAL_CI',注意字符集的字母都要大写)
  localAddress 此IP用于TCP连接(可选)
  socketPath 连接到unix域路径,当使用 host 和 port 时会被忽略
  timezone 时区(默认:'local')
  connectTimeout 连接超时(默认:不限制;单位:毫秒)
  stringifyObjects 是否序列化对象
  typeCast 是否将列值转化为本地JavaScript类型值 (默认:true)
  queryFormat 自定义query语句格式化方法
  supportBigNumbers 数据库支持bigint或decimal类型列时,需要设此option为true (默认:false)
  bigNumberStrings supportBigNumbers和bigNumberStrings启用 强制bigint或decimal列以JavaScript字符串类型返回(默认:false)
  dateStrings 强制timestamp,datetime,data类型以字符串类型返回,而不是JavaScript Date类型(默认:false)
  debug 开启调试(默认:false)
  multipleStatements 是否许一个query中有多个MySQL语句 (默认:false)
  flags 用于修改连接标志
  ssl 使用ssl参数(与crypto.createCredenitals参数格式一至)或一个包含ssl配置文件名称的字符串,目前只捆绑Amazon RDS的配置文件

 

2、封装 mysql 的执行语句

// db.js

// 使用mysql2
const mysql = require('mysql2');
// 引入mysql配置文件
const dbConfig = require('./db.config');

module.exports = {
    query: function(sql, params, callback) {

        // 每次使用的时候需要创建链接,数据操作完成之后要关闭连接
        const connection = mysql.createConnection(dbConfig)

        connection.connect(function(err) {
            if (err) {
                throw err
            }

            // 执行数据操作
            connection.query(sql, params, function(err, results, fields) {

                if (err) {
                    throw err
                }

                // 将查询出来的数据返回给回调函数
                callback &&
                    callback(
                        results ? JSON.parse(JSON.stringify(results)) : null,
                        fields ? JSON.parse(JSON.stringify(fields)) : null
                    )

                // 停止链接数据库,必须在查询语句后,不然一调用这个方法,就直接停止链接,数据操作就会失败
                connection.end(function(err) {
                    if (err) {
                        console.log('关闭数据库连接失败!')
                        throw err
                    }
                })
            })
        })
    },
}

3、后端路由文件 

// 引入数据库封装对象
var db = require('./db.js');

// 引入express包
var express = require('express');

//创建路由器对象
var router = express.Router();

// 配置路由对象
router.get('/userList', (req, res, next) => {
    // sql查询user表
    db.query('select * from list', [], function(results, fields) {
        // 以json的形式返回
        res.json({ results })
    })
})

 

三、数据库操作( CURD )

1、查询数据

connection.query('SELECT * FROM `books` WHERE `author` = "David"', function (error, results, fields) {
       if(error){
          console.log('[SELECT ERROR] - ',error.message);
          return;
       }
 
       console.log('--------------------------SELECT----------------------------');
       console.log(results);
       console.log('------------------------------------------------------------\n\n');  
});
connection.query('SELECT * FROM `books` WHERE `author` = ?', ['David'], function (error, results, fields) {
       if(error){
          console.log('[SELECT ERROR] - ',error.message);
          return;
       }
 
       console.log('--------------------------SELECT----------------------------');
       console.log(results);
       console.log('------------------------------------------------------------\n\n');  
});

2、插入数据

var  addSql = 'INSERT INTO websites(Id, name, url, alexa, country) VALUES(0,?,?,?,?)';
var  addSqlParams = ['菜鸟', 'https://xxx.com','23453', 'CN'];

// 执行插入数据
connection.query(addSql,addSqlParams,function (err, result) {
        if(err){
         console.log('[INSERT ERROR] - ',err.message);
         return;
        }        
 
       console.log('--------------------------INSERT----------------------------');
       //console.log('INSERT ID:',result.insertId);        
       console.log('INSERT ID:',result);        
       console.log('-----------------------------------------------------------------\n\n');  
});

3、更新数据

var modSql = 'UPDATE websites SET name = ?,url = ? WHERE Id = ?';
var modSqlParams = ['菜鸟', 'https://xxx.com', 6];

// 更新数据
connection.query(modSql,modSqlParams,function (err, result) {
  if(err){
      console.log('[UPDATE ERROR] - ',err.message);
      return;
  }        
  console.log('--------------------------UPDATE----------------------------');
  console.log('UPDATE affectedRows', result.affectedRows);
  console.log('-----------------------------------------------------------------\n\n');
});

4、删除数据

var delSql = 'DELETE FROM websites where id=6';

// 删除数据
connection.query(delSql, function (err, result) {
        if(err){
          console.log('[DELETE ERROR] - ',err.message);
          return;
        }        
 
       console.log('--------------------------DELETE----------------------------');
       console.log('DELETE affectedRows', result.affectedRows);
       console.log('-----------------------------------------------------------------\n\n');  
});

4、获取受影响的行数

// 从插入、更新或删除语句中获取受影响的行数
connection.query('DELETE FROM posts WHERE title = "wrong"', function (error, results, fields) {
  if (error) throw error;
  console.log('deleted ' + results.affectedRows + ' rows');
})

5、获取更改的行数

// 从更新语句中获取更改的行数
// changedRows与affectedRows的不同之处在于,值未更改的更新行不被列入changedRows
connection.query('UPDATE posts SET ...', function (error, results, fields) {
  if (error) throw error;
  console.log('changed ' + results.changedRows + ' rows');
})

6、多语句查询

// 多语句查询会被SQL注入,如果确定想使用可以开启
var connection = mysql.createConnection({
    multipleStatements: true
});

7、事务

// 开启一个简单的事务
connection.beginTransaction(function(err) {
  if (err) { throw err; }
  connection.query('INSERT INTO posts SET title=?', title, function (error, results, fields) {
    if (error) {
      return connection.rollback(function() {
        throw error;
      });
    }
 
    var log = 'Post ' + results.insertId + ' added';
 
    connection.query('INSERT INTO log SET data=?', log, function (error, results, fields) {
      if (error) {
        return connection.rollback(function() {
          throw error;
        });
      }
      connection.commit(function(err) {
        if (err) {
          return connection.rollback(function() {
            throw err;
          });
        }
        console.log('success!');
      });
    });
  });
});

 

四、Exception Safety 类型重铸

默认情况下,驱动程序会将 mysql 类型转换为原生 JavaScript 类型。

mysql javascript
TINYINT Number
SMALLINT
INT
MEDIUMINT
YEAR
FLOAT
DOUBLE
TIMESTAMP Date
DATE
DATETIME
TINYBLOB Buffer
MEDIUMBLOB
LONGBLOB
BLOB
BINARY
VARBINARY
BIT (last byte will be filled with 0 bits as necessary)
char String
varchar
tinytext
mediumtext
longtext
text
enum
set
decimal
bigint
time
geometry

五、具体操作演示

使用 express-generator 来快速搭建一个项目
 

入口文件

// index.js

const userApi = require('./api/myApi');
const fs = require('fs');
const path = require('path');
// body-parser - node.js 中间件,用于处理 JSON, Raw, Text 和 URL 编码的数据
const bodyParser = require('body-parser');

// 引入express包
const express = require('express');
// 创建web服务器
const app = express();

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));

// 后端api路由
app.use('/api/user', userApi);

// 监听端口
app.listen(3000);
console.log('success listen at port: 3000......');

后端路由文件

// api.js

// 引入封装 mysql 查询函数
var db = require('./db');
// 引入express包
var express = require('express');

// 创建路由器对象
var router = express.Router();


// Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件
var multer = require('multer');

// 格式化时间模块Silly-datetime
var datetime = require('silly-datetime');

var fs = require('fs');
var path = require('path')
var UUID = require('uuid')

// multer 自定义存储的方式
var storage = multer.diskStorage({  
    // 保存路径
    destination: function (req, file, cb) {
        // 注意这里的文件路径,不是相对路径,直接填写从项目根路径开始写就行了
        cb(null, 'static/public/uploads')  
    },  
    // 保存在 destination 中的文件名
    filename: function (req, file, cb) {  
        var str = file.originalname.split('.');  
        cb(null, UUID.v1() + '.' + str[1]);  
    }  
})

var upload = multer({storage: storage})


// 设置返回response
var jsonWrite = function (res, ret) {
    if (typeof ret === 'undefined') {
        res.json({
            code: '1',
            msg: '操作失败'
        });
    } else {
        console.log('ret', ret)
        res.json(ret);
    }
};

// 增加用户接口
router.post('/addUser', (req, res) => {
  let params = req.body;
  db.query("select * from user where user_id=?", [params.id], function (err, result) {
    if (err) {
      console.log(err);
    }

    if (result) {
      if (result.length > 0) {
        jsonWrite(res, {
          code: -1,
          msg: '该账号已注册!'
        });
      } else {
        db.query("INSERT INTO user(user_id,user_nick,gender,password) VALUES(?,?,?,?)", [params.id, params.nick, params.gender, params.password], function (err, result) {
          if (err) {
            console.log(err);
          }

          if (result) {
            jsonWrite(res, {
              code: 200,
              msg: '注册用户成功!'
            });
          }
        })
      }
    }
  })

});

数据库配置文件 

// db.config.js

// 数据库连接配置
module.exports = {
	mysql: {
		host: 'localhost', // 主机地址 (默认:localhost)
		user: 'root', // 数据库用户名
		password: 'root', // 数据库密码
		database: 'schoolmarket', // 数据库名
		port: '3306' // 端口号 (默认:3306)
	}
}

封装 mysql 查询函数

// db.js

// 使用mysql2
const mysql = require('mysql2');
// 引入mysql配置文件
const dbConfig = require('./db.config');

module.exports = {
    query: function(sql, params, callback) {

        // 每次使用的时候需要创建链接,数据操作完成之后要关闭连接
        const connection = mysql.createConnection(dbConfig)

        connection.connect(function(err) {
            if (err) {
                throw err
            }

            // 执行数据操作
            connection.query(sql, params, function(err, results, fields) {

                if (err) {
                    throw err
                }

                // 将查询出来的数据返回给回调函数
                callback &&
                    callback(
                        results ? JSON.parse(JSON.stringify(results)) : null,
                        fields ? JSON.parse(JSON.stringify(fields)) : null
                    )

                // 停止链接数据库,必须在查询语句后,不然一调用这个方法,就直接停止链接,数据操作就会失败
                connection.end(function(err) {
                    if (err) {
                        console.log('关闭数据库连接失败!')
                        throw err
                    }
                })
            })
        })
    },
}

 

启动项目

server是入口文件 index.js 的文件夹的名字

node server

六、查看数据库

可以使用 navicat premium 等数据库可视化工具进行查看操作数据库。

七、调用接口

可以使用浏览器或 postman 来调用接口查看返回的情况。

参考文档

Node.js 连接 MySQL | 菜鸟教程

mysql - npm

mysql2 - npm文章来源地址https://www.toymoban.com/news/detail-725439.html

到了这里,关于Node.js 连接 mysql 数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • “Node.js:操作mysql数据库“

    Node.js中操作mysql数据库 ​ mysql模块 是托管于npm的第三方模块,它提供了Node.js项目中 连接 和 操作mysql数据库 的能力。 在项目中操作数据库的步骤 (1).安装mysql数据库的第三方模块(mysql) (2).通过mysql模块连接到mysql数据库 (3).通过mysql模块执行sql语句 1.操作mysql数据库 db.query() 用来

    2024年02月05日
    浏览(39)
  • 在Node.js中使用MongoDB连接数据库、创建集合

    本文主要介绍在Node.js中使用MongoDB连接数据库、创建集合的方法。 在Node.js中使用MongoDB连接数据库有两种方式:使用原生驱动程序和使用Mongoose。 首先,需要安装 mongodb 模块。可以通过以下命令来安装: 安装完成后,可以在代码中引入模块: 接着,可以使用 MongoClient 来连接

    2024年02月04日
    浏览(55)
  • 前端使用node.js连接sql.server数据库教程

    最近项目中要用到node写接口然后连接公司现有的sql.server数据库,再把执行结果返回给前端(还是我),因为之前一直做前端这块,后端这方面不是很懂,花了很长的时间终于研究出来了(还是太菜了,走了很多弯路),所以写个博客,一是复习巩固,二是给其他有需要的小伙伴一个参考,尽量

    2024年02月11日
    浏览(60)
  • Node.js程序如何访问MySQL数据库呢?Sequelize操作MySQL数据库详解

    当我们安装好MySQL后,Node.js程序如何访问MySQL数据库呢? 访问MySQL数据库只有一种方法,就是通过网络发送SQL命令,然后,MySQL服务器执行后返回结果。 我们可以在命令行窗口输入mysql -u root -p,然后输入root口令后,就连接到了MySQL服务器。因为没有指定–host参数,所以我们连

    2023年04月08日
    浏览(46)
  • Vue项目通过node连接MySQL数据库并实现增删改查操作

    1.创建Vue项目 Vue项目创建的详细步骤,有需要的可移步这里 2.下载安装需要的插件 下载express 下载cors,用于处理接口跨域问题 下载mysql 下载axios 3.在项目中创建server文件夹,用于搭建本地服务器 新建/server/app.js,用于配置服务器相关信息 新建/server/db/index.js,用于配置数据库

    2024年02月16日
    浏览(65)
  • MySQL数据库 – node使用

    1 MySQL查询对象 2 MySQL查询数组 3 mysql2库介绍使用 4 mysql2预处理语句 5 mysql2连接池使用 6 mysql2的Promi 这里仅说明如何使用服务器连接数据库并进行操作。 预处理语句就是可以输入变量的语句(表现形式是有符号:?)。需要使用.execute来执行;   需要运行普通的语句(不添加变

    2024年02月08日
    浏览(47)
  • nodejs进阶(6)—连接MySQL数据库

    连接MySQL数据库需要安装支持 npm install mysql 我们需要提前安装按mysql sever端 建一个数据库mydb1 然后建一张表user如下 接下来我们利用nodejs连接mysql数据库 但是实际每次创建连接都需要一定的开销,执行效率就会有影响。下面介绍一种连接池连mysql的方法:node-mysql node-mysql是目前

    2024年02月05日
    浏览(44)
  • Mongodb 以及 node.js中使用mongoose操作数据库

    目录 1、lowdb 2、Mongodb是什么? 3、Mongodb核心概念 4、Mongodb的下载与使用 5、数据库与集合命令 5.1、数据库命令 5.2、集合命令 5.3、文档命令 6、Mongoose 6.1、插入文档 6.2、字段类型 6.3、字段值验证 6.3.1、必填项 6.3.2、默认值 6.3.3、枚举值 6.3.4、唯一值 6.4、删除文档 6.5、更新文

    2024年02月11日
    浏览(45)
  • 【实战】nodejs 必会技能 —— 封装 mysql 数据库连接

    [mysql - mysql中文文档翻译 - Breword 文档集合]:(https://www.breword.com/mysqljs-mysql) 安装依赖包: [mysql - npm]:(https://www.npmjs.com/package/mysql) 运行中若遇到如下报错,请检查输入信息是否正确(host、port、user、password 等),jdbc配置中拿到的相关信息尤其是密码很可能是加密后的 node -

    2024年02月10日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包