之前在学习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;
以上就是一个简单的登录,注册,修改密码的接口了。里面逻辑没有写的那么严谨,也没有加校验,纯粹是入门用的。希望对你有所帮助!!!