node + express + mongodb 入门!!!

1 篇文章 0 订阅
1 篇文章 0 订阅

效果图

以上是我使用 Node + Express + MongoDB 写的一个小 demo,它重点实现了以下几个功能:

  • 基于 MongoDB 实现的 增 删 改 查
  • 支持分页、模糊查询
  • 接口访问支持 Token 验证

先看看 Gif 吧,在线预览暂时上不了🤷🏻‍♂️

前言

一直以来对于后端比较好奇与向往,最早的时候是想学会一门后端语言整个个人博客玩玩。当时准备学 php ,在接触到 hexo 捣鼓出了一个 个人博客 后,于是就放弃了学习这门 世界上最好的语言🐶,直到后来接触了 NodeJS

作为前端多少会了解一点 NodeJS ,它和原生js语法几乎一模一样。对于纯前端来说,想要了解后端开发是什么样子,NodeJS 可以说是首选。一直想要使用 Node 和 MongoDB 实现个什么,最近利用闲暇时间接触了下相关知识,写出了上图所示的小 demo。写下这篇文章记录下我在实现过程中遇到的一些坑,也希望能帮到看标题进来的人。

安装 MongoDB

首先前往 这个地址 下载 MongoDB

然后按照 Windows平台安装MongoDB教程 这篇教程安装 MongoDB ,亲测完美安装。

如果想要 MongoDB 的图形化软件的,可以下载 Robo 3T ,还可以简单易用,它长这个样子,还是很简洁明了的:

在这里插入图片描述

然后将菜鸟教程上面的 例子 敲一遍就可以撸起袖子干了。

express 中跨域问题的解决

跨域在我们前端的日常开发中会经常遇到。我在写应用时就遇到过两次,一种是没加 token 验证的时候,加的是以下代码:

app.all('*', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "X-Requested-With");
    res.header("Access-Control-Allow-Methods", "PUT,POST,GET,DELETE,OPTIONS");
    res.header("X-Powered-By", ' 3.2.1')
    res.header("Content-Type", "application/json;charset=utf-8");
    next();
});

它可以解决跨域,但是加了 token 之后会仍然会报跨域错误,找了好久才找到下面的代码,完美解决:

app.options("/*", function (req, res, next) {
    res.header('Access-Control-Allow-Origin', '*');
    res.header('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE,OPTIONS');
    res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, Content-Length, X-Requested-With');
    res.sendStatus(200);
});

app.all('*', function (req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    next();
});

加入 Token 验证

在计算机身份认证中是令牌(临时)的意思,一般作为邀请、登录系统使用。

一来它可以用来验证用户的身份,二来它具有时效性,只要有效期没过,用户不用每次都输入密码也能进入系统。

在这里我采用的是 jsonwebtoken + express-jwt 实现的 token 验证。基本的流程是这样的:

  1. 服务端通过登录接口获取到用户信息,根据它生成一段加密字符串返回给客户端,这个就是 token,它具有时效性。
  2. 客户端接收到 token 后,在每个接口请求里都带上它
  3. 服务端验证此 token 是否有效判断是否返回数据,通过解密这个 token 也能获取到用户信息

上代码:

// tokenVerify.js

const jwt = require('jsonwebtoken');
const signKey = 'dizuncainiao_hello_nodeJs_world';

exports.setToken = function (userName, userId) {
    return new Promise((resolve, reject) => {
        const token = jwt.sign({
            name: userName,
            _id: userId
        }, signKey, {expiresIn: '0.01h'});
        resolve(token);
    })
}

exports.verifyToken = function (token) {
    return new Promise((resolve, reject) => {
        const info = jwt.verify(token.split(' ')[1], signKey);
        resolve(info);
    })
}
// app.js

···
// 验证 token 是否过期并规定哪些路由不用验证
app.use(expressJwt({
    secret: 'dizuncainiao_hello_nodeJs_world',
    algorithms: ['HS256']
}).unless({
    path: ['/login', '/register'] // 白名单
}));

// 当 token 失效返回提示信息
app.use(function (err, req, res, next) {
    if (err.status === 401) {
        return res.status(401).send({msg: 'token失效'});
    }
});
···

更详细的源码会在后面贴出~

MongoDB 分页查询 和 模糊查询

MongoDB 中的分页查询是这样的:假设当前页是 2,分页数是 10,它需要跳过第一页,然后往后再找 10 条,代码如下:

const page = 2
const pageSize = 10
const skipNum = (page - 1) * pageSize
db.getCollection('users').find({}).skip(skipNum).limit(pageSize)

分页接口都会有一个总条数,可以使用以下方式获取:

db.getCollection('users').countDocuments({})

模糊查询可以将匹配的单词放在正则里即可实现:

db.getCollection('users').find({"userName": /word/}) // 包含
db.getCollection('users').find({"userName": /^word/}) // 开头
db.getCollection('users').find({"userName": /word$/}) // 结尾

以上便是我写的 demo 中的重点了。 点击此处查看源码

后续

原生的 mongodb 让我们面对这样的困境, 编写 MongoDB 验证,转换和业务逻辑是非常麻烦的。
Mongoose 为模型提供了一种直接的,基于 scheme 结构去定义你的数据模型。它内置数据验证, 查询构建,业务逻辑钩子等,开箱即用。

Mongoose 可以提供更强大的功能,后面有时间接触一下~~

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

帝尊菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值