node+express+mongose写简单的登录注册接口

之前在学习react-native的时候,想用react-native做一个登录注册页面,但是苦于没有现成的登录注册接口。于是想到前一段时间学习的node,于是想为什么不用node+mongoose自己写一个接口呢。在查资料,踩坑后,一个可用的接口终于被搞出来了。很简单的接口,对于学习过后端语言的来说可能不堪入目,对于想要接触后端的前端开发来说,或许有一些可以参考的地方。

安装node和mongodb:

    node: https://nodejs.org

    mongoose: https://www.mongodb.com

    由于安装比较简单,不在详细介绍        

启动MongoDB连接数据库:

    在终端执行命令:$ mongod

    重开一个终端执行命令:$ mongo

    如果出现下图这样的箭头,则表示连接成功



robomongo: mongoose的可视化工具,很方便。

    下载地址:https://robomongo.org/

    如果你的mongoose已经成功启动,当你打开robomongo的时候会自动连上你的数据库

mongoose数据库中默认的数据库有三个,System, config, test。默认情况下你新建的集合是放在test下。当然,你也可以建自己的数据库,把你的所有集合都放在你的数据库中

下面是MongoDB的一些基本概念,和常用命令:


1、查询库、查询表

    $ show dbs  //查询所有的数据库

    $ show collections   //查询当前数据库下的所有数据表

2、建库和删库(database)

    $ use myDbs  //建立一个名为myDbs的数据库,当这个库存在时则是切换到这个数据库中去
    // 如果数据库不存在,则创建数据库.
    // use 命令只是向MongoDB注册database,并没有实际的创建使用show dbs 查看,列表中没有该database。

    $ db.foo.insert({_id:1,name:"test"})  
    // 在当前database中创建collection,并向集合中插入数据

    // 此时,MongoDB真正创建database,查看存储数据的folder,发现多了两个.wt文件,一个用于存储数据,一个用于存储index。使用show dbs 查看,列表中存在该database。

    $ use myDbs

    $ db.dropDatabase();  //这两句是删除这个数据库

3、建表和删表(collection)

    $ db.name.insert({}) 

  // 隐式创建Collection,在第一次向Collection插入数据时,MongoDB会自动创建Collection;如果Collection已经存在于Database中,那么MongoDB直接向Collection中插入数据。

    $ db.createCollection(name, {}); 

  // 显式创建Collection,通过指定Collection Option,创建特定用途的Collection。

    $ db.myTable.drop();  //删除myTable这个数据表

  //如果没有指定数据库,表会创建在mongdb默认数据库test里

4、文档(document)的增删改

    $ db.myTable.insert({name:’hahaha’,age:12});  //新增

    $ db.myTable.update({name:’hf’},{$set:{age:25}})  //修改

    $ db.myTable.remove({name:’hf'});  //删除

5、查询文档(document)

    $ db.myTable.find(query, projection);  //查询myTable中的所有数据
    // query: 可选,指定的查询条件

    // projection: 可选,使用投影操作符指定返回的键。

    $ db.myTable.find({'age': {$type: 2}}).pretty(); 

    // 选择myTable表中,age 的数据类型为String的数据

    $ db.myTable.find().pretty(); // pretty()方法以格式化方式来显示所有文档

    $ db.myTable.find().sort({age:1})  //根据age升序,1为升序,-1位降序

    $ db.myTable.find().count();  //查询


下面我们正式开始写接口,具体代码查看https://github.com/tianya930502/node_mongodb_port

1.新建项目: 

    如 node_mongodb_port

2.进入项目,初始化 

    $ cd node_mongodb_port 

    $ npm init     可以一直按回车     

3.此时项目中会有一个package.json文件,在该文件中添加下面代码

"dependencies": {
    "body-parser": "^1.18.2",
    "express": "^4.16.2",
    "mongoose": "^5.0.1",
    "eslint": "^4.19.1",
    "eslint-config-airbnb": "^16.1.0",
    "eslint-plugin-import": "^2.11.0",
    "eslint-plugin-jsx-a11y": "^6.0.3",
    "eslint-plugin-react": "^7.7.0"
  }

4. 安装包 $ npm install

当安装成功后我们的前期工作就做完了,可以开始正式写业务代码了

5.在项目中新建server.js文件,作为我们的项目入口文件

    server.js

var app = require('./app');
var port = process.env.PORT || 3000; // 启动的端口号

app.listen(port, function() {
  console.log('Express server listening on port ' + port);
});

6.在项目中新建app.js文件

    app.js

var express = require('express');
var app = express();

// 模拟登录注册接口
var UserController = require('./user/UserController');
app.use('/user', UserController);

module.exports = app;

7.在项目中新建user/UserController.js文件,这是我们的逻辑文件

   user/UserController.js

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var bodyParser = require('body-parser');

mongoose.connect('mongodb://localhost:27017/Table');
// 连接的是我本地数据库中的Table库
router.use(bodyParser.urlencoded({ extended: true }));
router.use(bodyParser.json());

// 每一个Schema对应MongoDB中的一个集合(collection)。Schema中定义了集合中文档(document)的格式。
var UserSchema = new mongoose.Schema({
    name: String,
    password: String,
    // status: String
});
const Users = mongoose.model('login', UserSchema);
// 用户访问的是Table库中的login集合

{... 这里面将会放下面的登录,注册,修改密码的代码 ...}

module.exports = router;

上面的user/UserController.js并不完整,只是一个框架,先对里面的一些代码做解释

mongoose.connect('mongodb://localhost:27017/Table');
// 连接的是我本地数据库中的Table库

const Users = mongoose.model('login', UserSchema);
// 用户访问的是Table库中的login集合,数据库的集合中默认会加s,所以显示出来的是logins

下图是我的数据库


8.在user/UserController.js文件中添加注册接口

// 用户注册,向数据库中添加用户数据
router.post('/register', function (req, res) {
    const newUser = new Users({ // 用户传参
        name : req.body.name,
        password : req.body.password,
        // status: req.body.status
    });
    const name = req.body.name;
    Users.find({name: name},(err, docs) => {
        if(docs.length > 0) {
            res.send({isSuccess: false, message: '用户名已存在'})
        } else { // 向logins集合中保存数据
            newUser.save(err => {
                const datas =  err ? {isSuccess: false} : {isSuccess: true, message: '注册成功'}
                res.send(datas);
            });
        }
    })
});

运行项目 $ node server

➜  node_mongodb_port git:(master) ✗ node server
Express server listening on port 3000

出现上面提示表示运行成功(执行node server前,要确保MongoDB已运行成功,即已经执行了mongod命令和mongo命令)

9.测试一下我们的注册接口是否成功 (因为是POST请求,推荐使用postman工具测试)


如上图所示,我向本地注册接口localhost:3000/user/register传了两个参数{name:'萨瓦迪卡',password:'123456'}

给我返回注册成功(返回的消息也是自己定制的让返回什么)

然后我们刷新数据库,可以看到数据库中已经添加了新数据了


10.同样的,我们可以再添加登录,修改密码的功能

// 用户登录,查询数据库,判断用户名和密码是否匹配
router.post('/login', function (req, res) {
    const name = req.body.name;
    const password = req.body.password;
    Users.find({name: name}, function (err, users) {
        console.log(users);
        if(users.length === 0) {
            res.send({isSuccess: false, message: '该用户不存在'});
        } else if (users[0].password === password) {
            res.send({isSuccess: true, message: '登录成功'});
        } else if (users[0].password !== password) {
            res.send({isSuccess: false, message: '密码不正确,请重新输入'});
        }
    });
});

// 修改密码
router.post('/change', function (req, res) {
    const name = req.body.name;
    const OldPass = req.body.OldPass;
    const NewPass = req.body.NewPass;
    Users.find({name: name}, function (err, user) {
        if(user.length === 0) {
            res.send({isSuccess: false, message: '该用户名不存在'});
        } else {
            const data = user[0];
            if(data.password === OldPass) {
                data.password = NewPass;
                data.save(err => {
                    const datas =  err ? {isSuccess: false, message: '密码修改失败'} : {isSuccess: true, message: '密码修改成功'}
                    res.send(datas);
                });
            } else {
                res.send({isSuccess: false, message: '您输入的密码不正确'});
            }

        }
    });
});

11.完整的user/UserController.js

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var bodyParser = require('body-parser');

mongoose.connect('mongodb://localhost:27017/Table');
// 连接的是我本地数据库中的Table库
router.use(bodyParser.urlencoded({ extended: true }));
router.use(bodyParser.json());

// 每一个Schema对应MongoDB中的一个集合(collection)。Schema中定义了集合中文档(document)的格式。
var UserSchema = new mongoose.Schema({
    name: String,
    password: String,
    // status: String
});
const Users = mongoose.model('login', UserSchema);
// 用户访问的是Table库中的login集合

// 用户注册,向数据库中添加用户数据
router.post('/register', function (req, res) {
    const newUser = new Users({
        name : req.body.name,
        password : req.body.password,
        // status: req.body.status
    });
    const name = req.body.name;
    Users.find({name: name},(err, docs) => {
        if(docs.length > 0) {
            res.send({isSuccess: false, message: '用户名已存在'})
        } else {
            newUser.save(err => {
                const datas =  err ? {isSuccess: false} : {isSuccess: true, message: '注册成功'}
                res.send(datas);
            });
        }
    })
});

// 用户登录,查询数据库,判断用户名和密码是否匹配
router.post('/login', function (req, res) {
    const name = req.body.name;
    const password = req.body.password;
    Users.find({name: name}, function (err, users) {
        console.log(users);
        if(users.length === 0) {
            res.send({isSuccess: false, message: '该用户不存在'});
        } else if (users[0].password === password) {
            res.send({isSuccess: true, message: '登录成功'});
        } else if (users[0].password !== password) {
            res.send({isSuccess: false, message: '密码不正确,请重新输入'});
        }
    });
});

// 修改密码
router.post('/change', function (req, res) {
    const name = req.body.name;
    const OldPass = req.body.OldPass;
    const NewPass = req.body.NewPass;
    Users.find({name: name}, function (err, user) {
        if(user.length === 0) {
            res.send({isSuccess: false, message: '该用户名不存在'});
        } else {
            const data = user[0];
            if(data.password === OldPass) {
                data.password = NewPass;
                data.save(err => {
                    const datas =  err ? {isSuccess: false, message: '密码修改失败'} : {isSuccess: true, message: '密码修改成功'}
                    res.send(datas);
                });
            } else {
                res.send({isSuccess: false, message: '您输入的密码不正确'});
            }

        }
    });
});

module.exports = router;


以上就是一个简单的登录,注册,修改密码的接口了。里面逻辑没有写的那么严谨,也没有加校验,纯粹是入门用的。希望对你有所帮助!!!


            

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值