mongose + express 写REST API
一、准备工具
先确保电脑已经安装好nodejs
1.mongoose;安装非常简单: npm install mongoose --save 【mongoose封装了mongodb的方法,调用mongoose的api可以很轻松的对mongodb进行操作】
2.express;npm install express --save 【Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,
和丰富的 HTTP 工具。使用 Express 可以快速地搭建一个完整功能的网站。】
3.mongodb(mongodb安装可以看我写的博客)
二、新建db.js文件,引入mongoose连接mongodb数据库服务,
将这个文件模块化,module.exports = mongoose;暴露mongoose,方便其他文件require引入使用
const mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1/wuyan');
/**
* 连接成功
*/
mongoose.connection.once('connected', function () {
console.log('数据库连接成功');
});
/**
* 连接异常
*/
mongoose.connection.once('error', function (err) {
console.log('数据库连接错误: ' + err);
});
/**
* 连接断开
*/
mongoose.connection.once('disconnected', function () {
console.log('数据库连接已关闭');
});
module.exports = mongoose;
三、新建model.js文件,引入上面新建的db.js文件
创建属于mongoose的Schema对象
构造users跟books两个集合,并导出model对象供其他文件使用
const mongoose = require('./db.js');
const Schema = mongoose.Schema;
const userSchema = new Schema({
username:String,
password:String,
gender:String
})
const bookSchema = new Schema({
title:String,
desc:String,
prize:String
})
module.exports = {
// users、books表示存放文档的集合名称(从myslq的角度看就是创建users表,表的字段是userSchema构造器写的属性)
UserModel:mongoose.model('users',userSchema),
BookModel:mongoose.model('books',bookSchema)
}
四、新建service.js文件,引入上面新建的model.js文件
对文档进行增删改查操作
const model = require('./model');
// 注册账号
function _Register(params = {}, callback) {
model.UserModel.create(params, (err, res) => {
if (!err) {
console.log('注册成功')
callback && callback(res);
}
})
}
_Register({username:'测试名',password:'1233454',gender:'男'});
在存放service.js的文件夹下打开命令行,键入node service.js 即可看到效果


不过上面做的并不能实现我说的目地,所以继续将这个文件的各个方法暴露出去
const model = require('./model');
// 注册账号
function _Register(params = {}, callback) {
model.UserModel.create(params, (err, res) => {
if (!err) {
console.log('注册成功')
callback && callback(res);
}
})
}
// 登录
function _Login(params = {}, callback) {
model.UserModel.find(params, (err, res) => {
if (!err) {
if (res.length > 0) {
console.log('登录成功')
callback && callback(res);
} else {
console.log('用户名或者密码错误')
}
}
})
}
function _AddBook(book = {}, callback) {
model.BookModel.create(book, (err, res) => {
if (!err) {
console.log('添加书本成功')
callback && callback(res);
}
})
}
// 获取用户列表
function _GetUserList(parmas = {}, callback) {
model.UserModel.find(parmas, (err, res) => {
if (!err) {
callback && callback(res);
}
})
}
module.exports = {
register: _Register,
login: _Login,
addBook: _AddBook,
getUserList: _GetUserList
}
五、新建app.js文件 并引入上面新建的service.js文件
引入express文件写REST API接口
const service = require('./model/service');
const express = require('express');
const bodyParser = require('body-parser')
const app = express();
// 获取post方法的传参 需要引入body-parser(npm install body-parser -- save)
app.use(bodyParser.urlencoded({extended:false}))
// 静态文件
app.use(express.static('public'));
// REST API
app.all('*', function (req, res, next) {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
next();
});
app.get('/login', (req, res) => {
let params = req.query;
service.register(params, (result) => {
res.json(result)
});
})
app.get('/userList', (req, res) => {
let parmas = req.query;
service.getUserList(parmas, (result) => {
res.json(result);
})
})
app.post('/register',(req,res)=>{
let parmas = req.body;
service.register(parmas,(result)=>{
res.json(result);
})
})
app.listen(3000, () => console.log('Example app listening on port 3000!'))
六、前端调用接口
<!DOCTYPE html>
<html lang="en"> <head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>express API</title>
</head> <body>
<button onclick="getUserList()">获取所有用户数据</button>
<div>
<table>
<thead>
<tr>
<td>姓名</td>
<td>密码</td>
<td>性别</td>
</tr>
</thead>
<tbody class="content"> </tbody>
</table>
</div>
<button onclick="register()">注册</button>
</body>
<script src="../public/js/jquery-3.3.1.js"></script>
<script>
function getUserList() {
$.ajax({
url: 'http://localhost:3000/userList',
type: 'get',
dataType: 'json',
success: function (data, status) {
let str = '';
for (let i = 0; i < data.length; i++) {
str = str + `
<tr>
<td>${data[i].username}</td>
<td>${data[i].password}</td>
<td>${data[i].gender}</td>
</tr>
`
}
$('.content').append(str); },
fail: function (err, status) {
console.log(err)
}
})
} function register() {
$.ajax({
url: 'http://localhost:3000/register',
data: {
username:'z',
password:'123456',
gender:'男'
},
type: 'post',
dataType: 'json',
success: function (data, status) { },
fail: function (err, status) {
console.log(err)
}
})
} </script> </html>

END
mongose + express 写REST API的更多相关文章
- 用expressjs写RESTful API
http://blog.csdn.net/kiwi_coder/article/details/36424671 用expressjs写RESTful API http://blog.csdn ...
- 使用Express构建RESTful API
RESTful服务 REST(Representational State Transfer)的意思是表征状态转移,它是一种基于HTTP协议的网络应用接口风格,充分利用HTTP的方法实现统一风格接口的 ...
- Django使用AJAX调用自己写的API接口
Django使用AJAX调用自己写的API接口 *** 具体代码和数据已上传到github https://github.com/PythonerKK/eleme-api-by-django-rest ...
- 一个用beego写的API项目
beego-api 一个使用beego写的API 支持Api日志 支持Swagger注解文档 项目地址: https://github.com/eternity-wdd/beego-api 使用说明 ...
- 通过express来打造api服务器
通过express来打造api服务器[ 后端接口 ] 1.步骤 1.通过脚手架创建项目 const express = require('express'); const router = expre ...
- express 写一个简单的web app
之前写过一个简单的web app, 能够完成注册登录,展示列表,CURD 但是版本好像旧了,今天想写一个简单的API 供移动端调用 1.下载最新的node https://nodejs.org/zh- ...
- 第一次写Web API接口
API是什么?只知道是网络接口,具体怎么写?不会!如何调用?不会!那怎么办? 第一次的经历~~ 需求:为其他项目提供一个接口 功能:为项目提供询盘信息和商家信息,格式为Json字符串 拿过来,就开始做 ...
- Python用Django写restful api接口
用Python如何写一个接口呢,首先得要有数据,可以用我们在网站上爬的数据,在上一篇文章中写了如何用Python爬虫,有兴趣的可以看看: https://www.cnblogs.com/sixrain ...
- 研发团队如何写好API接口文档
导读 背景 痛点在哪? 为什么要写接口文档? API规范 接口工具 总结 背景 随着业务的发展,支撑组的项目也是越来越多.同时,从整个支撑组项目架构体系(含运维和运营体系),我们对系统业 ...
随机推荐
- 【xsy2913】 enos 动态dp
题目大意:给你一棵 $n$个点 以 $1$为根 的树,每个点有$ 0,1,2 $三种颜色之一,初始时整棵树的颜色均为 $0$. $m$ 次操作, 每次操作形如: 1 x y c : 将 $x$到$y$ ...
- numpy.random.randn()与numpy.random.rand()的区别(转)
numpy中有一些常用的用来产生随机数的函数,randn()和rand()就属于这其中. numpy.random.randn(d0, d1, …, dn)是从标准正态分布中返回一个或多个样本值. n ...
- Oracle的卸载过程步骤
用Oracle自带的卸载程序不能从根本上卸载Oracle,从而为下次的安装留下隐患,那么怎么才能完全卸载Oracle呢?那就是直接注册表清除,步骤如下: 1. 开始->设置->控制面板-& ...
- Java 多线程学习笔记:wait、notify、notifyAll的阻塞和恢复
前言:昨天尝试用Java自行实现生产者消费者问题(Producer-Consumer Problem),在coding时,使用到了Condition的await和signalAll方法,然后顺便想起了 ...
- keepalived双机热备,安装部署文档
keepalived双击热备,安装部署文档: 下载目录:/apps/keepalived-1.2.7.tar.gz 1:---> yum install -y make wget 2:---&g ...
- [转]Android中handler机制的原理
Andriod提供了Handler 和 Looper 来满足线程间的通信.Handler先进先出原则.Looper类用来管理特定线程内对象之间的消息交换(MessageExchange). 1)Loo ...
- [转]让程序不触发 Vista/Win7下应用程序兼容性助手弹出 .
原文地址 http://blog.csdn.net/maxuhuiabc/article/details/6081874 在Vista/Win7下 运行一个 exe 应用程序后,系统经常弹出 兼容性助 ...
- php -- 数据库信息
----- 023-dbinfo.php ----- <!DOCTYPE html> <html> <head> <meta http-equiv=" ...
- php里use关键字与class_alias的作用域区别
use可以用在命名空间下,也可以不用再命名空间下,他在两者中的作用是一致的,都是在编译的时候执行,不真正的加载类,因为是编译的时候执行,所以只能在全局环境使用,及不能使用在方法内部,条件判断内部. 引 ...
- -bash: warning: setlocale: LC_CTYPE: cannot change locale (zh_US.UTF-8): No such file or directory -bash: warning: setlocale: LC_COLLATE:
前几天登录服务器发现出现了这些个警告,一直没时间去处理他,今天难得有空,处理一下并记录下来,希望可以帮助到有需要的朋友. 警告信息如下: Last :: from 10.0.0.1 -bash: wa ...