Node操作mysql

配置

  1. 安装mysql模块

    复制代码
    npm i mysql
  2. 建立连接

    javascript 复制代码
    const mysql = require('mysql');
    
    const db = mysql.createPool({
        host: '127.0.0.1',
        user: 'root',
        password: 'admin123',
        database: 'my_db_01'
    });
  3. 测试

    javascript 复制代码
    // select 1没有任何实质性作用 只是检查mysql模块是否正常
    db.query('select 1', (err, results) => {
        if (err) return console.log(err.message);
        console.log(results);
    });

操作数据库

  1. 查询数据

    javascript 复制代码
    // query函数第一项为查询的sql语句
    const sqlStr = 'select * from users';
    db.query(sqlStr, (err, results) => {
        if (err) console.log(err);
      // 如果执行的是select查询语句,则执行成功的结果是数组
        console.log(results);
    });
  2. 插入数据

    javascript 复制代码
    // 插入数据
    const user = {username: 'wl', password: '7777777'};
    // '?'问号为要填充的值的占位符
    const sqlStr = "insert into users (username, password) value  (?, ?)";
    // 如果执行的是insert插入语句,则执行成功的结果是对象
    db.query(sqlStr, [user.username, user.password], (err, results) => {
        if (err) console.log(err);
        if (results.affectedRows === 1) console.log('插入数据成功');
    });
    // ----------------------------------------------------------------------
    // 便捷插入数据方式
    const user = {username:'Bruce', password:'55520'};
    const sql = 'insert into users set ?';
    db.query(sql, user, (err, results) => {
      ...
    });
  3. 更新数据

    javascript 复制代码
    const sql = 'update users set username=?, password=? where id=?';
    db.query(sql, [username, password, id], (err, results) => {
      ...
    });
      
    // ----------------------------------------------------------------------
    const user = {id:7, username:'Bruce', password:'55520'};
    const sql = 'update users set ? where id=?';
    db.query(sql, [user, user.id], (err, results) => {
      ...
    });
  4. 删除数据

    javascript 复制代码
    const sql = 'delete from users where id=?';
    db.query(sql, 7, (err, results) => {
      if (err) console.log(err);
      if (results.affectedRows === 1) console.log('删除数据成功');
    });

    使用 delete 语句会真正删除数据,保险起见,使用标记删除的形式,模拟删除的动作。即在表中设置状态字段,标记当前的数据是否被删除。

    javascript 复制代码
    // 利用status标记数据是否删除,1为删除
    db.query('update users set status=1 where id=?', 7, (err, results) => {
      ...
    })

身份认证

session认证

服务端渲染推荐使用 Session 认证机制,不跨域的方式。

jwt认证

前后端分离推荐使用 JWT(JSON Web Token)认证机制,是目前最流行的跨域认证解决方案。

示例

javascript 复制代码
const express = require('express');
const jwt = require('jsonwebtoken');
const { expressjwt: expressJWT } = require("express-jwt");
const bodyParser = require('body-parser');

const app = express();

// 密钥为任意字符串
const secretKey = 'Bruce ^_^';

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

// 注册将JWT解析还原成json的中间件
// unless({ path: [/^\/api\//] }) 指定哪些接口无需访问权限
app.use(expressJWT({ secret: secretKey, algorithms: ['HS256']}).unless({ path: [/^\/api\//] }));

app.post('/api/login', (req, res) => {
    const user = req.body;
    // 登录失败
    if (user.username !== 'admin' && user.password !== '000000') {
        return res.send({
            status: 400,
            message: '登录失败',
        });
    }
    // 登录成功
    // jwt.sign() 生成 JWT 字符串
    // 参数:用户信息对象、加密密钥、配置对象--token有效期
    // 尽量不保存敏感信息,因此只有用户名,没有密码
    const tokenStr = jwt.sign({username: user.username}, secretKey, {expiresIn: '1h'});
    res.send({
        status: 200,
        message: '登录成功',
        token: tokenStr,
    })
});

// 获取用户信息
app.get('/admin/getinfo', (req, res) => {
    console.log(req.auth);
    res.send({
        status: 200,
        message: '获取信息成功',
        data: req.auth,
    });
});

//  Express 的错误中间件,捕获这个错误并进行相关的处理
app.use((err, req, res, next) => {
    // 无效的token
    if (err.name === 'UnauthorizedError') {
        return res.send({ status: 401, message: 'Invalid token' });
    }
    // 其他错误
    res.send({ status: 500, message: 'Unknown error' });
});
// 启动服务器
app.listen(8888, () => {
    console.log('http://127.0.0.1')
});
相关推荐
心灵Haven3 分钟前
Centos7 + Mysql8.0
mysql·centos
星蓝_starblue27 分钟前
零服务器、零数据库!开源growth-board,利用GitHub自动管理刷题/学习/求职全流程
服务器·数据库·程序人生·系统架构·node.js·github·改行学it
三8443 小时前
sqli-labs1-10通关笔记
数据库
BullSmall4 小时前
Another Redis Desktop Manager(ARDM)下载指南
数据库·redis·缓存
SelectDB4 小时前
Apache Doris 倒排索引工作原理:全文检索提速 59 倍,点查提速 14 倍
数据库
码农颜4 小时前
5.1.1 原⼦性
数据库·mysql
机建狂魔4 小时前
Codex 接入第三方模型 API 实战:以 Mimo 为例
java·服务器·数据库·ai·ai编程·codex
山峰哥5 小时前
数据库工程与SQL调优:从慢查询到秒级响应的实战之路
java·开发语言·数据库·sql·深度优先·启发式算法
moMo5 小时前
# 向量数据库入门:从"关键词匹配"到"语义理解"
数据库
ACP广源盛139246256735 小时前
DeepSeek‑V4‑Flash 公测@ACP#昇腾 950 国产算力组合落地,国产 PCIe 交换芯片 IX9104 有哪些硬件机会
大数据·数据库·人工智能·分布式·单片机·嵌入式硬件·microsoft