使用mongodb数据库+node.js封装接口详细过程

2023-11-16

学习内容:

使用mongodb存储数据,用node语言编写后端


学习产出:

【下载mongoose依赖包】

npm install mongoose

【创建一个js文件】

keys.js

文件写入路径配置(模块入口)

module.exports = {
  mongoURI: "mongodb://localhost/playground",
  secretOrkey: "secret",
};

mongoURI是连接mongodb数据库的路径,路径中的数据库(此代码的数据库名为playground)不存在则会创建该数据库。

【server.js入口文件】

导入mongoose

const mongoose=require("mongoose");

引入keys.js

const db=require("./config/keys").mongoURI;

连接数据库

mongoose
  .connect(db)
  .then(() => console.log("数据库连接成功"))
  .catch((err) => console.log(err, "数据库连接失败"));

【搭建路由】

新建文件夹routes

在routes中新建文件 users.js

1.需要导入express、router

const express = require("express");
const router = express.Router();

2.即可使用router提供的方法

router.get("/test",(req,res)=>{

res.json({msg:"user"})})

注册登录使用post,token验证使用get

还是要将users.js文件引入到server.js入口文件中

const users=require("./routes/api/users");

引入后要使用routes

app.use("api/users",users)

【创建模型】存储响应的数据

新建文件夹models

新建文件 Users.js

1.导入mongoose   使用mongoose.Schema

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

2.创建Schema

const UserSchema = new Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
  avatar: {
    type: String,
  },
  identity: {
    type: String,
    required: true,
  },
  date: {
    type: Date,
    default: Date.now,
  },
});

3.暴露接口User

module.exports = User = mongoose.model("users", UserSchema);

4.在接口server.js文件去使用

【搭建注册接口并存储数据】

 使用post请求数据需要安装第三方库   在server.js中去引入

以及使用body-parser中间件

 npm install body-parser

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

users.js文件

注册用户

router.post("/register", (req, res) => {
  console.log(req.body);
  //查询数据库中是否拥有邮箱
  User.findOne({ email: req.body.email }).then((user) => {
    if (user) {
      return res.status(400).json("邮箱已被注册!");
    } else {
      const avatar = gravatar.url(req.body.email, {
        s: "200",
        r: "pg",
        d: "mm",
      });
      const newUser = new User({
        name: req.body.name,
        email: req.body.email,
        //相同名字写一个
        avatar,
        password: req.body.password,
        identity: req.body.identity,
      });
      //saltRounds:加密的模式--10
      // bcrypt.genSalt(saltRounds, function (err, salt) {
      //   bcrypt.hash(myPlaintextPassword, salt, function (err, hash) {
      //     // Store hash in your password DB.
      //   });
      // });
      bcrypt.genSalt(10, function (err, salt) {
        bcrypt.hash(newUser.password, salt, function (err, hash) {
          // Store hash in your password DB.
          if (err) throw err;
          newUser.password = hash;
          newUser
            .save() //存储方法
            .then((user) => res.json(user)) //如果返回成功
            .catch((err) => console.log(err));
        });
      });
    }
  });
});

【登录】

密码匹配==当前请求的与数据库存储的比较     使用jwt返回token

//3.登录密码匹配
//$route POST api/users/login
//@desc 返回token jwt passport
//@access public
router.post("/login", (req, res) => {
  const email = req.body.email;
  const password = req.body.password;
  //查询数据库
  User.findOne({ email }).then((user) => {
    if (!user) {
      return res.status(404).json("用户不存在!");
    }
    // 密码匹配(当前请求到前端的密码与数据库存储的密码对比)
    bcrypt.compare(password, user.password).then((isMatch) => {
      if (isMatch) {
        //jwt.sign("规则","加密名字","过期时间","箭头函数")签名
        const rule = {
          id: user.id,
          name: user.name,
          avatar: user.avatar,
          identity: user.identity,
        };
        jwt.sign(rule, keys.secretOrkey, { expiresIn: 3600 }, (err, token) => {
          if (err) throw err;
          res.json({
            success: true,
            token: "Bearer " + token,
          });
        });
        //res.json({ msg: "success" });
      } else {
        return res.status(400).json("密码错误!");
      }
    });
  });
});

【验证token】

使用passport  ==  要对其初始化(server.js)引入passport.js 文件并传入passport(目的:可以直接使用passport不用导入了)

app.use(passport.initialize());

require("./config/passport")(passport);

config文件夹创建一个文件passport.j

const JwtStrategy = require("passport-jwt").Strategy;
const ExtractJwt = require("passport-jwt").ExtractJwt;
const mongoose = require("mongoose");
const User = mongoose.model("users");
const keys = require("../config/keys");

const opts = {};
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();
opts.secretOrKey = keys.secretOrkey;

module.exports = (passport) => {
  passport.use(
    new JwtStrategy(opts, (jwt_payload, done) => {
      // console.log(jwt_payload);
      User.findById(jwt_payload.id)
        .then((user) => {
          if (user) {
            //done回调,null对象,返回user
            return done(null, user);
          }
          return done(null, false);
        })
        .catch((err) => console.log(err));
    })
  );
};
//4.验证token
//$route GET api/users/current(信息)
//@desc 返回 current user
//@access private
// router.get("/current","验证token(passport-jwt)",(req,res)=>{
//   res.json({msg:"success"})
// })
router.get(
  "/current",
  passport.authenticate("jwt", { session: false }),
  (req, res) => {
    res.json({
      id: req.user.id,
      name: req.user.name,
      email: req.user.email,
      identity: req.user.identity,
    });
  }
);

这是users,js文件请求当前的用户信息,passport.js是通过passport-jwt方法验证

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用mongodb数据库+node.js封装接口详细过程 的相关文章

随机推荐

  • 主数据管理系统(MDM)调研总结!!!

    文章目录 一 引言 1 1 主数据背景 1 2 主数据定义 1 3 主数据管理 1 3 1 什么是主数据管理系统 1 3 2 主数据管理的两体系一工具 1 3 3 主数据管理的挑战 1 4 主数据与其它数据的关系 1 4 1 主数据与元数据
  • Mybatis知识总结(三):Crud的实现,Mybatis的参数和输出及配置文件

    一 知识复习 1 1 自定义流程再分析 1 2 mybatis 环境搭建步骤 第一步 创建 maven 工程 第二步 导入maven坐标 第三步 编写必要代码 实体类和持久层接口 第四步 编写 SqlMapConfig xml 第五步 编写
  • 【EDA Tools】Spyglass 检查 Verilog 和 SystemVerilog 混合语言及 Lint 检查

    目录 写在前面 读入设计 发现问题并解决 Lint 检查 写在前面 Spyglass可以用于检查混合设计中的语言互操作性和一致性问题 对于设计中包含多种硬件描述语言的情况 Spyglass 能够识别并解析其中的模块及其互连 并对其进行验证
  • 前端要懂的色域知识

    前端也要面对 五彩斑斓的红 这种世纪难题了吗 rgb 255 0 0 真的是红色吗 现在有个 CSS 色值 rgb 255 0 0 请问一下各位 在网页上展示的是什么颜色 各位可能不用思考就马上能够脱口而出 红色 But 各位有没有想过 这
  • 【Redis从入门到进阶】第 2 讲:Jedis 的快速掌握

    本文已收录于专栏 Redis从入门到进阶 专栏前言 本专栏开启 目的在于帮助大家更好的掌握学习Redis 同时也是为了记录我自己学习Redis的过程 将会从基础的数据类型开始记录 直到一些更多的应用 如缓存击穿还有分布式锁等 希望大家有问题
  • Unity接入腾讯广告/腾讯联盟/优量汇SDK操作步骤——源码+图文效果详情

    Unity接入腾讯广告 腾讯联盟 优量汇SDK操作步骤 源码 图文效果详情 前言 一 下载SDK 二 官网注册相关项目信息 1 新建媒体 2 新建广告位 三 更改代码 1 更改初始化SDK的代码 2 更改对应的ID 总结 版权声明 前言 最
  • k8s部署springboot

    前言 首先以SpringBoot应用为例介绍一下k8s的部署步骤 1 从代码仓库下载代码 比如GitLab 2 接着是进行打包 比如使用Maven 3 编写Dockerfile文件 把步骤2产生的包制作成镜像 4 上传步骤3的镜像到远程仓库
  • Ubuntu系统在终端中重启与关机

    如果你想保持当前用户的登录而并且使用root用户执行命令 可以输入 su root 即可 输入蜜码 可以运行 shutdown 命令 重启命令 1 reboot 2 shutdown r now 立刻重启 root用户使用 3 shutdo
  • Oracle 按创建时间排序,如果创建时间为空,将记录放置在最后

    oracle处理方式 在oracle中字段为空值时 被认为为最大 可通过 nulls last 将空值放到最后 语法 select from 表名 order by 排序字段 desc nulls last 实战 select from u
  • win10操作系统瘦身之微信减肥法

    很多人发现 win 10的系统盘空间一直在减少 甚至到跳出空间不足红色警告 但是又不知道哪里出问题 系统盘的容量到底被什么给吃了 所以今天就说说系统瘦身中 很管用的一个方法 减少微信的历史记录法 首先看下微信软件某个目录的空间占用情况 图1
  • 给自己的逆向工程阶段性学习感想总结

    想到哪写哪 逆向工程的学习比起近似的pwn来说 还是没那么吃基础的 不过基础知识和能力的牢固程度还是近乎决定了一个re手的上限 自己在这方面还是欠缺了不少 目前最吃亏的一个方面是代码分析能力 或者说算法能力 或者说正向能力 发现在做中难题的
  • Unity3D:角色拾取技术

    工程包下载 Unity3D虚拟现实开发之角色拾取 这个是成品图 角色拾取的原理是 由摄像机与屏幕上鼠标点击的位置确定一条射线 由此射线射向3D世界 最先和此射线相交的物体就是被选中的物体 然后对该物体的操控编写对应的代码即可 具体代码如下
  • 【python基础知识】21.高效偷懒的正确打开方式-毕业篇

    文章目录 前言 明确项目目标 分析过程 拆解项目 逐步执行 代码实现 版本1 0 输入表头 确定模版数据 阶段2 获取 复用模版数据 阶段3 0 写入csv文件 结语 前言 光阴似箭 日月如梭 不知不觉我们来到了Python基础语法课的最后
  • springboot项目启动报错:java.io.EOFException: null

    springboot项目启动时报 java io EOFException null异常 但是不影响功能 可能原因是由于tomcat上次非正常关闭时有一些活动session被持久化 表现为一些临时文件 在重启时 tomcat尝试去恢复这些s
  • ARM(IMX6U)裸机汇编LED驱动实验——驱动编写、编译链接起始地址、烧写bin文件到SD卡中并运行

    参考 Linux之ARM IMX6U 裸机汇编LED驱动实验 驱动编写 作者 一只青木呀 发布时间 2020 08 07 09 13 48 网址 https blog csdn net weixin 45309916 article det
  • Masm for Winodws 集成实验环境安装绿色免费版

    Masm for Winodws 集成实验环境安装绿色免费版 用于汇编的开发环境 绿色安全下载途径 希望能帮到有需要的人 不喜勿喷 提取文件后解压后 打开文件下载安装即可 百度网盘下载 链接 https pan baidu com s 1U
  • notepad++ 配置 python 以及Anaconda中的python(已解决)

    说明 无论是自己的电脑单独安装的python 还是Anaconda虚拟环境安装的python都是一样的 区别就是 独立安装的python 的exe文件路径添加的环境变量了 不需要制定它的路径直接运行下面的命令就可以 而Anaconda中的p
  • 常用js

    1 去掉字符串两端的空格 对字符串去两端空格 function stringTrim str if str null str undefined return null 用正则表达式将前后空格 用空字符串替代 return str repl
  • win10中不同版本jdk切换

    1 设置系统变量 java home8 java home8 以及java home 2 若无法切换jdk版本 可以在系统变量path中 删除默认路径 3 测试版本切换是否成功 一定要重启cmd
  • 使用mongodb数据库+node.js封装接口详细过程

    学习内容 使用mongodb存储数据 用node语言编写后端 学习产出 下载mongoose依赖包 npm install mongoose 创建一个js文件 keys js 文件写入路径配置 模块入口 module exports mon