❤Node10-登录注册接口

news2024/9/22 3:28:50

❤Node10-登录注册接口​

接下来我们在node 之中实现一个/api/login 登录接口,并且从数据库user表中校验用的账号和密码是否存在,存在返回token。

1、用户登录接口开发​

(1) 登录接口编写尝试​

接下来我们利用登录接口返回我们的token认证,我们做一个简单的模拟

javascript


// 用户登录接口
app.post('/api/login', (req, res) => {
    let query = 'SELECT * FROM user';
     // 登录失败
    if (req.body.username !== 'admin' && req.body.password !== '123456') {
      return res.send({
        status: '400',
        message: '登录失败'
      })
    }
    // 登录成功
    // 格式:jwt.sign({用户信息},密钥,token有效时长)
    var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })
    res.send({
      status: 200,
      message: '登录成功',
      token: tokenStr
    })
});

整个流程是这样子的:

vue

请求接口,开始认证是否在白名单中
在白名单中,进行账号密码判断
失败=》返回信息
正确=》 jwt注册账号名,然后加密以后返回token

当我们输入正确的账号密码时:

JS

{
  "status": 200,
  "message": "登录成功",
  "token": "eyJXXXXXXXXXJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

错误时:

JS

{
  "status": 200,
  "message": "登录成功",
  "token": "eyJXXXXXXXXXJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

js

{
  "status": "400",
  "message": "登录失败"
}

这里遇到了一下小问题,写的判断居然市失效了,最后清理了一下缓存,重新优化一下判断

javascript

// 用户登录接口
app.post('/api/login', (req, res) => {
    // let query = 'SELECT * FROM user';
    console.log(req.body,'req');
    console.log(req.body.username == 'admin');
    console.log(req.body.password == '123456');
    if (req.body.username == 'admin' && req.body.password == '123456') {
      // 登录成功
      console.log(111);
        // 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码
        // 格式:jwt.sign({用户信息},密钥,token有效时长)
        var tokenStr = jwt.sign({ username: req.body.username }, secretKey, { expiresIn: '2h' })
        res.send({
          status: 200,
          message: '登录成功',
          token: tokenStr
        })
    }else{
       // 登录失败
       console.log(222);
       res.send({
        status: '400',
        message: '登录失败'
      })
    }
});

ok! 问题成功解决!到这里我们的登录接口就已经开发成功了!

(2)数据库调用尝试​

接下来我们先设置一个固定的账号密码进行一下调用尝试:

这里需要住的的是账号密码自己取的值部分从哪里来,一开始我经常混淆req.body和req.query的取值部分,这里可以都打印出来看看取值的部分,免得错误,然后怎么找也发现不了问题!

javascript

// 用户登录接口
app.post('/api/login', (req, res) => {
    // let query = 'SELECT * FROM user';
    console.log(req.body,'req');
    console.log(req.body.username == 'admin');
    console.log(req.body.password == '123456');

    if (req.body.username == 'admin' && req.body.password == '123456') {
        // 登录成功
        console.log(111);
        // 先制作jwt字符串 记住千万不要把密码加密到 token 字符串中,这样容易被人破解密码
        // 格式:jwt.sign({用户信息},密钥,token有效时长)
        var tokenStr = jwt.sign({username: req.body.username },secretKey, { expiresIn: '24h' })
        res.send({
          code: 200,
          message: '登录成功',
          token: tokenStr,
        })
    }else{
       // 登录失败
       console.log(222);
       res.send({
        code: '400',
        message: '账号不存在!'
      })
    }
   
});

然后对返回结果进行查看,没问题:

JS

{
  "status": 200,
  "message": "登录成功",
  "token": "eyJhbxxxXVCJ9.eyJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

(2)数据库匹配账号密码​

接下来从数据库里面查询我们的账号密码是否匹配

javascript

// 用户登录接口
app.post('/api/login', (req, res) => {
    // let query = 'SELECT * FROM user';
    // console.log(req.body,'req');
    // console.log(req.body.username == 'admin');
    // console.log(req.body.password == '123456');
     const { username, password } = req.body;

    // if (req.body.username == 'admin' && req.body.password == '123456') {}

     let sql='SELECT * FROM user WHERE username = ?';
      // 查询数据库中是否存在匹配的用户名
    connectionpool.query(sql,[username],(error, results) => {

      if (error) throw error;
      // 检查查询结果是否为空
      if (results.length === 0) {
        return res.status(401).json({ message: '用户名不存在' });
      }
      console.log(results[0].passward,'results-passward');
      console.log('password',password);

      // const user = results[0];
      if(results[0].passward==password){
        var tokenStr = jwt.sign({username: req.body.username },secretKey, { expiresIn: '24h' });
        console.log('登录成功');
        res.send({
          code: 200,
          message: '登录成功',
          token: tokenStr,
        })
      }else{
        console.log('登录失败',user.password,password);
        return res.status(401).json({ message: '密码不正确',code:401 });
      }
    }
  ); 
});

成功时候给与我们的提示:

JS

{
  "status": 200,
  "message": "登录成功",
  "token": "eyJhbxxxXVCJ9.eyJ1c2VybmFtZSI6ImFkbW1uIiwiaWF0IjoxN"
}

失败时候给与我们的提示:

JS

{
  "code": 500,
  "message": "密码不正确"
}

2、用户注册接口开发​

(1)接口开发和思考​

先起个名:(用户注册接口名称为)'/api/register'

思考

用户的注册其实本质上不就是新用户的增加吗,所以我们这里其实本质上也是直接对于用户的一个增加,这里我们只需要将用户增加的接口迁移过来即可
这里需要注意的点就是:我们在增加直接应该先去数据库里面看一下用户是否已经存在,如果存在的话,那我们就应该让用户重新拟定自己的昵称,避免和数据库之中的重复!

先来看看我们数据库的指令需要什么

javascript

// 查询用户 
SELECT * FROM user WHERE username = admin


//添加用户 
INSERT INTO user (name,username, password,state) VALUES (?,?,?,1)

接下来我们开始写一个注册用户的接口

javascript

// 用户注册接口
app.post('/api/register', (req, res) => {
  
    console.log(req.body,'req');
    const { username, password } = req.body;
    
    let sql='SELECT * FROM user WHERE username = admin';
      // 查询数据库中是否存在匹配的用户名
    connectionpool.query(sql,[username],(error, results) => {
        // console.log(results,'查询结果!');

      if (error) throw error;
        const name=username;
        const values = [name,username, password];
        // 准备 SQL 插入语句
        const insertSql = ``;
        connectionpool.query(insertSql, values, (err, results) => {
            console.log(results,'results-插入结果!');
            if (err) {
                console.error('Error querying database:', err);
                res.status(500).json({ error: 'Internal server error' });
            }
            res.json({
                code: '200',
               );
        });
     

    }
  ); 
});

(2)优化存在用户的情况​

完善添加一下是否添加的用户已经跟数据库里面的用户重复的情况

javascript

// 用户注册接口
app.post('/api/register', (req, res) => {
  
    console.log(req.body,'req');
    const { username, password } = req.body;
    
    let sql='SELECT * FROM user WHERE username = ?';
      // 查询数据库中是否存在匹配的用户名
    connectionpool.query(sql,[username],(error, results) => {
        // console.log(results,'查询结果!');

      if (error) throw error;
      // 检查查询结果是否为空
      if (results.length !== 0) {
        res.json({
                code: 401,
                data: results,
                message:'用户名已经存在!'
        });
      }else{
        const name=username;
        const values = [name,username, password];
        // 准备 SQL 插入语句
        const insertSql = `INSERT INTO user (name,username, password,state) VALUES (?,?,?,1)`;
        connectionpool.query(insertSql, values, (err, results) => {
            console.log(results,'results-插入结果!');
            if (err) {
                console.error('Error querying database:', err);
                res.status(500).json({ error: 'Internal server error' });
                return;
            }
            res.json({
                code: '200',
                data: results,
                message:'用户注册成功,欢迎你去登陆!'
            });
        });
      }
    }
  ); 
});

测试成功 ! 当用户注册成功的时候,用户应该去进行登陆!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用Diskgenius系统迁移

使用Diskgenius系统迁移 1、使用系统迁移2、注意点3、新备份的系统盘装在电脑上可能出现盘符错乱导致开机不进入桌面情况 1、使用系统迁移 参考视频: DiskGenius无损系统迁移,换硬盘无需重装系统和软件 2、注意点 1)新的硬盘里面的所有资料…

linux安装Anaconda3

先将Anaconda3安装包下载好,然后在主文件夹里新建一个文件夹,将Anaconda3安装包拖进去。 打开终端未来不出现缺东西的异常情况,我们先安装 yum install -bzip2然后进入根目录下,在进入Anaconda3文件夹下 sh包安装方式 sh Anac…

为什么用迭代器调用不了对象中的函数

没加const可以 加了const就不行 我懂了 加了const v的值就不能修改,我的那些函数都可以修改值 应该是 好像不对 有大佬会吗

vue 实现tab菜单切换

1、目标&#xff1a; 实现切换tab菜单&#xff0c;激活状态&#xff0c;按钮高亮&#xff0c;显示对应的菜单内容 2、实现 <template><div class"tan_menu"><ul class"container"><liclass"item"v-for"item in tab…

常用工具推荐!分享7款AI论文修改软件工具网站

在当今学术研究和写作领域&#xff0c;AI论文修改软件工具已经成为了不可或缺的助手。这些工具不仅能够帮助研究人员提高写作效率&#xff0c;还能确保论文的质量和原创性。以下是七款值得推荐的AI论文修改软件工具网站&#xff0c;其中特别推荐千笔-AIPassPaper。 1. 千笔-AI…

C++编程语言:基础设施:命名空间(Bjarne Stroustrup)

第 14 章 命名空间(Namespaces) 目录 14.1 组成问题(Composition Problems) 14.2 命名空间(Namespaces) 14.2.1 显式修饰(Explicit Qualification) 14.2.2 使用using 声明 14.2.3 using 指令 14.2.4 参数依赖查询 14.2.5 命名空间的开放性 14.3 模块化和接口 …

智能BI项目第五期

本期主要内容 系统问题分析异步化业务流程分析线程池讲解&#xff08;入门 原理 实战&#xff09;系统异步化改造开发 1.系统问题分析 当系统面临大量用户请求时&#xff0c;我们后端的 AI 处理能力有限&#xff0c;例如服务器的内存、CPU、网络带宽等资源有限&#xff0c…

git 本地分支误删,怎么恢复?误删本地已提交未推送的分支!

误删本地已提交未推送的分支&#xff01; 前提&#xff1a; 已提交&#xff01; 重点&#xff1a;未推送&#xff01; 要是推送了&#xff0c;再拉一下代码就行了。你也不会来搜这个帖子了。 如果你删除的分支里有你未提交的代码&#xff0c;不用往下看了&#xff0c;帮不到你…

港湾周评|2万元的三折叠手机可能与普通人无关

《港湾商业观察》李镭 三折叠手机时代正式开启&#xff0c;你准备好了吗&#xff1f; 9月20日上午&#xff0c;华为Mate XT非凡大师正式开售&#xff0c;据悉各大平台迅速售罄&#xff0c;华为商城显示&#xff0c;9月21日将再次放货。 该款手机被称为全球首款商用三折叠手机…

OpenWrt 定时重启

问题 想设置 OpenWrt 定时重启&#xff0c;避免因长期不重启导致的问题。 方法 参考 Scheduling tasks with cronopenwrt设置定时重启&#xff08;天/周/月&#xff09;定时重启openwrt (istoreos) 软路由系统 设置 cron 自启动 System - Start up - 找到 cron - 设置成自…

Java中List、ArrayList与顺序表

List、ArrayList与顺序表 List什么是List常用方法介绍List的使用 ArrayList与顺序表线性表顺序表接口的实现 ArrayList简介ArrayList的使用ArrayList的构造ArrayList的常见操作ArrayList的遍历ArrayList的扩容机制 ArrayList的具体使用杨辉三角简单的洗牌算法 ArrayList的问题及…

一个安卓鸿蒙化工具

DevEco插件&#xff0c;为已有安卓项目鸿蒙化加速。 目前支持&#xff1a; 1、安卓Vector Assets转svg&#xff1b; 2、json转ets model&#xff1b; 3、kotlin model转ets model&#xff1b; 下载地址&#xff1a;andtoharplugin1.1.0 安装&#xff1a; deveco插件安装选硬…

2024年华为杯研赛(E题)|高速公路应急车道启用建模|数学建模竞赛解题思路|完整代码论文集合

我是Tina表姐&#xff0c;毕业于中国人民大学&#xff0c;对数学建模的热爱让我在这一领域深耕多年。我的建模思路已经帮助了百余位学习者和参赛者在数学建模的道路上取得了显著的进步和成就。现在&#xff0c;我将这份宝贵的经验和知识凝练成一份全面的解题思路与代码论文集合…

智慧医院人工智能应用场景 | 智能导诊系统源码

近年来&#xff0c;智能医疗在国内外的发展热度不断提升。图像识别、深度学习、神经网络、大模型、语音等关键技术的突破带来了人工智能技术新一轮的发展。 场景一&#xff1a;智能机器人 医疗机器人是指能够在医疗领域执行特定任务或功能的机器人&#xff0c;包括手术机器人、…

从零到一:打造安全高效敦煌测评自养号体系

敦煌测评自养号是一种提升店铺销售和排名的有效策略&#xff0c;卖家可以自行注册并管理买家账号&#xff0c;通过模拟真实买家行为为自家店铺进行测评和补单。以下是一些关键技巧&#xff0c;帮助卖家快速提升销售和排名&#xff1a; 一、账号注册与养号 环境搭建&#xff1…

js 将二进制文件流,下载为excel文件

吃西瓜 现成的粒子 二进制流&#xff0c;是一种计算机文件格式&#xff0c;它的数据以二进制形式存储&#xff0c;与文本文件不同&#xff0c; 二进制文件可以包含任意类型的数据&#xff0c;例如&#xff1a;图像、音频、视频、可执行文件、压缩文件等&#xff0c;而文本文…

基于协同过滤+python+django+vue的音乐推荐系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

linux cat命令的实现

cat 是 Linux 和其他 Unix-like 系统中的一个常用命令&#xff0c;它的名称来源于 "concatenate"&#xff08;连接&#xff09;的缩写。cat 命令主要用于查看、创建和拼接文件。它读取一个或多个文件的内容&#xff0c;并将它们显示在标准输出&#xff08;通常是终端…

DELPHI编译软件时带上当前IDE的版本号

如果通过 CompilerVersion 得到的也只是编译器的版本号。 比如&#xff1a;delphi XE12 是 36 &#xff0c;也仅此而己。 我想得到的是IDE的版本号&#xff0c;比如当前最新版本的DELPHI是&#xff1a;Embarcadero RAD Studio 12 Version 29.0.53571.9782 我想得到 29.0.53…

实验:WLAN无线综合实验

无线综合实验的概述&#xff1a; WLAN无线综合实验是一种针对无线网络技术的综合性实验&#xff0c;旨在通过实践操作加深对无线局域网&#xff08;WLAN&#xff09;技术的理解和应用能力。以下是对该实验的详细概述&#xff1a; 实验目的 掌握认证AP上线的配置方法&#xff…