使用node连接数据库 | 青训营笔记

74 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 15 天

安装模块

npm i express -S

npm i body-parser -S // 解析post请求参数插件

数据模型

id : 消息的唯一标识,
userId : 用户id,
content : '我是聊天内容' ,
creatTime : 消息创建时间

配置post请求参数

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

数据库

这里data的数据保存在服务器的内存中,数据量过大的话会大量的消耗浏览器的内存,影响服务器的性能甚至导致服务器瘫痪 所以要将数据保存到数据库中

使用

安装插件

npm i mysql2 -S

启动

在终端 启动 mysql -uroot -p123456

查看数据库 show databases;

连接数据库

引入:const mysql = require('mysql2')

连接:let db = mysql.createConnection({ // 配置 host : 'localhost', // ip地址 port : '3306', // 端口 user: 'root', // 数据库账号密码 password : 123456, database : 'test' // 数据库名字 })

创建表 在终端运行

先进入要操作的数据库中 use 数据库名;

`CREATE TABLE IF NOT EXISTS `messege`(
  `id` INT UNSIGNED AUTO_INCREMENT,
  `userId` VARCHAR(100) NOT NULL,
  `content` VARCHAR(40) NOT NULL,
  `createTime` DATE,
  PRIMARY KEY ( `id` )  // 主键
)ENGINE=InnoDB DEFAULT CHARSET=utf8;`

展示表 show tables

插入数据到数据库中

INSERT INTO table_name ( field1, field2,...fieldN ) VALUES ( value1, value2,...valueN );

如果数据是字符型,必须使用单引号或者双引号,如:"value"。

  // 插入数据
  let sql = 'insert into messege set userId=?,content=?,createTime=?'
  db.query(sql, [req.body.userId,req.body.content, req.body.createTime], (err, result) => {
    // 回调函数  第一个为返回的错误信息
    console.log(result);
    // ==1 表示数据插入成功
    if(result.affectedRows == 1){
      res.send({
        messege : '数据插入成功',
        code : 200,
        data 
      })
    }
  })

报错:Column 'userId' cannot be null
解决:传递参数时写错key了

查询聊天记录

app.get('/',(req, res)=> {
  db.query('select * from messege', (err, result) => {
    // console.log(result);
    res.send({
      messege : '数据获取成功',
      code : 200,
      data : result
    })
  })
})

使用Promise封装数据库操作

后续可能我们会对数据库进行好几层的操作,一层套一层,会造成回调地狱,这时候代码很难阅读 所以要进行promise封装,变成同步操作

// 封装  DbUtils.js
db.async = {}

// promise封装
db.async.query = (sql, params) => {
  return new Promise((resolve, reject) => {
    db.query(sql, params, (err, rows) => {
      resolve({err, rows})
    })
  })
}
// TestRouter.js
router.get('/test', async (req, res) => {
  // 同步写法
  // 把回调函数变成可异步执行 添加async
  let out = await db.async.query('select * from admin', [])

  res.send({
    id : genid.NextId(),
    out
  })
})