2

一、前言

通过本篇文章,你可掌握node.js关于注册用户、登录以及验证等相关知识,本篇中的代码块都处于一个文件index.js中。

二、相关技术点

主要工具
  • vscode
  • postman
  • mysql
node相关包
  • express
  • body-parser
  • bcryptjs
  • jwt

三、文件准备

  • 建立文件夹
  • 打开 vscode 控制台,cd 进入到该目录,输入命令 npm init -y 创建 package.json 文件
  • 安装相关包

    • express
    • mysql
    • body-parser
    • jsonwebtoken
    • bcryptjs
  • 创建 index.js文件
进行一些简单的配置
// 引入 mysql 连接数据库
const mysql = require("mysql");
// 数据库配置
// 我是利用 sqlyog 可视化工具建立的数据库 并且建立相应的表 user
const con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "123456",
  port: 3306,
  database: "blog",
});
// 定义一个执行 sql 语句的函数 并且返回一个 promise 对象
const exec = (sql) => {
  const promise = new Promise((resolve, reject) => {
    con.query(sql, (err, result) => {
      resolve(result);
    });
  });
  return promise;
};
// 连接数据库
con.connect();

// 引入其他相关包
const express = require("express");
var bodyParser = require("body-parser");
var bcrypt = require("bcryptjs");
const jwt = require("jsonwebtoken");
// 解析 post 请求体
app.use(bodyParser.json({ limit: "1mb" })); //body-parser 解析json格式数据
app.use(
  bodyParser.urlencoded({
    //此项必须在 bodyParser.json 下面,为参数编码
    extended: true,
  })
);
// 此变量为解析 token 密匙 变量比较隐私  应该放在其他地方 本文章简单使用一下
// 值为开发者随意设定的
const SECRET = "asdfjoijisadfjlkj";
// 创建服务器
const app = express();
// 监听3001端口
app.listen(3001, () => {
  console.log("服务器启动");
});

四、接口编写

用户注册
  • 密码不应该明文存储在数据库中,如果数据库被黑客入侵,就会非常危险,所以我们一般会将密码加密以后存储到数据库中,本篇文章用 bcryptjs 进行加密
  • bcryptjs 介绍 https://segmentfault.com/a/11...
app.post("/register", (req, res) => {
  const username = req.body.username;
  // 密码进行加密
  const password = bcrypt.hashSync(req.body.password, 10);
  const sql = `insert into user (username, password) values ('${username}', '${password}')`;
  exec(sql).then((result) => {
    return;
  });
  res.send("用户注册成功");
});
用户登录
app.post("/login", (req, res) => {
  // 从请求中获取请求体
  const { username, password } = req.body;
  const sql = `select * from user where username='${username}'`;
  exec(sql).then((result) => {
    const user = result[0];
    // 如果查询不到用户
    if (!user) {
      res.send("用户名不存在");
      return;
    }
    // 判断用户输入的密码和数据库存储的是否对应 返回 true 或者 false
    const isPasswordValid = bcrypt.compareSync(password, user.password);
    if (!isPasswordValid) {
      res.send("密码错误");
      return;
    }
    // 生成 token 将用户的唯一标识 id 作为第一个参数 
    // SECRET 作为取得用户 id 密匙
    const token = jwt.sign({ id: user.id }, SECRET);
    // 如果都通过了 则返回user 和 token
    // 返回的 token 应该存储在客户端 以便后续发起请求需要在请求头里设置
    res.send({ user, token });
  });
});
用户登录后,才能访问的接口
app.get("/profile", (req, res) => {
  // 从请求头里取出 token
  const token = req.headers.authorization.split(" ")[1];
  // token 验证取得 用户 id
  const { id } = jwt.verify(token, SECRET);
  // 查询用户
  const sql = `select * from user where id='${id}'`;
  exec(sql).then((result) => {
    // 返回用户信息
    res.send(result[0]);
  });
});

五、总结

用户注册发起请求,后端将密码加密后存储到数据库表中。登录的时候,先根据 username查询数据库判断是否有该用户,没有则返回用户不存在,用户存在则将登录所传的密码与数据库的密码做对比,会返回 true 或者 false,若为 false,则返回密码错误,若为 true,则返回用户信息和 token 值。访问需要 token 验证的接口时,在请求头中拿到 token 并且根据 token 查询数据库得到该用户信息存在后,在进行接下来的操作。


你会发光啊
8 声望0 粉丝