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 οnclick="getUserList()">获取所有用户数据</button><div><table><thead><tr><td>姓名</td><td>密码</td><td>性别</td></tr></thead><tbody class="content"> </tbody></table></div><button οnclick="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

 

转载于:https://www.cnblogs.com/zhangky/p/10281837.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365862.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js实现html模板继承,理解JavaScript中的原型和继承

本文主要讲了原型如何在JavaScript中工作&#xff0c;以及如何通过[Prototype]所有对象共享的隐藏属性链接对象属性和方法&#xff1b;以及如何创建自定义构造函数以及原型继承如何工作以传递属性和方法值。介绍JavaScript是一种基于原型的语言&#xff0c;这意味着对象属性和方…

将.py文件装成这执行文件.exe

目前已知 cx_freeze支持python3生成可执行文件 cx_freeze的操作 参考http://keliang.blog.51cto.com/3359430/661884 转载于:https://www.cnblogs.com/qingsheng/p/9599885.html

python测试脚本截图_selenium + python实现截图并且保存图片

webdriver的截图功能十分强悍&#xff0c;无论页面多长&#xff0c;webdriver都能比较完美的截到完整的页面。 python代码&#xff1a; # -*- coding: utf-8 -*- from selenium import webdriver import unittest import os, sys, time from pathlib import Path # 初始化实例 …

骁龙660是32位还是64位_高通发布骁龙 7c/8c 芯片,以后你可能会在电脑上看到它...

高通的芯片生意早已不局限于移动设备领域&#xff0c;而是进一步深入至 PC 市场。相比强调性能的 X86 芯片&#xff0c;以高通骁龙为代表的 ARM 系芯片则希望突出自己的优势&#xff0c;即更长的电池续航、无风扇设计和全天候的蜂窝网络连接。在骁龙技术峰会的第三天&#xff0…

Java泛型中的子类型化

泛型类型为Java程序引入了新的类型安全范围。 在同一类型上&#xff0c;泛型类型可以表现得很好&#xff0c;尤其是在使用通配符时 。 在本文中&#xff0c;我想解释子类型如何与Java泛型一起工作。 关于泛型类型子类型化的一般思考 不同泛型类型相同的类或接口的不定义亚型层…

css3之盒模型

什么是盒模型&#xff1f; css中的每个元素都是一个盒模型&#xff0c; 包括html body元素&#xff0c; 浏览器解析css的时候也会把每个元素看成一个盒子来解析。 盒模型具备的属性有&#xff1a; content 、padding 、margin、border 、background等 盒模型的分类&#xff1…

小朋友排队|2014年蓝桥杯B组题解析第十题-fishers

小朋友排队 n 个小朋友站成一排。现在要把他们按身高从低到高的顺序排列&#xff0c;但是每次只能交换位置相邻的两个小朋友。 每个小朋友都有一个不高兴的程度。开始的时候&#xff0c;所有小朋友的不高兴程度都是0。 如果某个小朋友第一次被要求交换&#xff0c;则他的不高兴…

学计算机的误解,让人误解的六大专业

原标题&#xff1a;让人误解的六大专业隔行如隔山&#xff0c;很多人喜欢看名字猜专业&#xff0c;所以导致很多大学专业被人误解。其实了解一个专业不能仅仅凭借它的名字&#xff0c;也不能断章取义&#xff0c;只取片面意思。接下来就让我们来了解一下有哪些被人误解的专业吧…

杂项:轮询

ylbtech-杂项&#xff1a;轮询1.返回顶部 1、轮询&#xff08;Polling&#xff09;是一种CPU决策如何提供周边设备服务的方式&#xff0c;又称“程控输出入”&#xff08;Programmed I/O&#xff09;。轮询法的概念是&#xff0c;由CPU定时发出询问&#xff0c;依序询问每一个周…

python类属性的调用方法_问一个关于PYTHON类属性调用方法的问题

def baidu(self): self.APP_ID2180368 self.API_KEYEYAvb2oTaGa9oSNs5S2yx6v self.SECRET_KEYdmgvBELGq9cMvk2uSPqLUaLUpEng02D self.aipAipOcr(self.APP_ID,self.API_KEY,self.SECRET_KEY) #1.这里定义的self.aip 3. 如果 我把这个self.aip定义在__init__(self)里面就不会报错…

js和css实现手机横竖屏预览思路整理

实现效果&#xff0c;如上图。 首先&#xff0c;实现手机页面在PC端预览&#xff0c; 则先在网上找到一个手机的背景图片&#xff0c;算好大概内间距&#xff0c;用来放预览的页面&#xff0c;我这里是给手机预览页面的尺寸按iphone5的尺寸来的&#xff1b; 一个手机页面在这里…

Lambda,会序列化吗?

因此&#xff0c;我一直在思考Tyrus项目所需的增强功能&#xff0c;该功能允许用户广播到跨机器集群连接到URL的客户端子集。 有多种方法可以做到这一点&#xff1b; 但是自从我使用JDK 8以来&#xff0c;这个问题肯定看起来像钉子。 为此&#xff0c;我创建了一个简单的单元测…

thinkphp日志泄漏漏洞_【Windows高危漏洞预警】CVE20200601,影响关键加密功能

一、事件报告2020年伊始&#xff0c;NSA发现了一个影响Microsoft Windows加密功能的严重漏洞(CVE-2020-0601)。证书验证漏洞允许攻击者破坏Windows验证加密信任的方式&#xff0c;并且可以启用远程代码执行。该漏洞会影响Windows 10和Windows Server 2016/2019以及依赖Windows的…

第一章计算机网络概述答案,第一章 计算机网络概述[3]

1-07 试在下列条件下比较电路交换和分组交换。要传送的报文共x(bit)。从源站到目的站共经过k段链路&#xff0c;每段链路的传播时延为d(s)&#xff0c;数据率为b(b/s)。在电路交换时电路的建立时间为S(s)。在分组交换时分组长度为p(bit)&#xff0c;且各结点的排队等待时间可忽…

meta标签的用处详解

meta标签的用处&#xff1a; 用来描述html文档的一个属性。列如作者。日期和时间&#xff0c;网页描述&#xff0c;关键字&#xff0c;页面刷新等。 是文档最基本的元数据 元数据&#xff08;metadata&#xff09;&#xff1a; 用来概括描述数据的一些基本数据 meta 标签的使用…

最小路径算法(Dijkstra算法和Floyd算法)

1.单源点的最短路径问题&#xff1a;给定带权有向图G和源点v&#xff0c;求从v到G中其余各顶点的最短路径。 我们用一个例子来具体说明迪杰斯特拉算法的流程。 定义源点为 0&#xff0c;dist[i]为源点 0 到顶点 i 的最短路径。其过程描述如下&#xff1a; 步骤dist[1]dist[2]di…

react如何监听路由url变化

"componentWillReceiveProps" "shouldComponentUpdate" "componentWillUpdate" "render" "componentDidUpdate" 使用这些生命周期钩子可以监听到路由相同&#xff0c;参数不同的变化&#xff0c;但是监听不到完全不相同的ur…

python 购物车程序_python_购物车程序

#需求1.启动程序后&#xff0c;让用户输入工资&#xff0c;然后打印商品列表 2.允许用户根据商品编号购买商品 3.用户选择商品后&#xff0c;检测余额是否够&#xff0c;够就直接扣款&#xff0c;不够就提醒 4.可随时退出&#xff0c;退出时&#xff0c;打印已购买商品和余额 #…

matlab tsai手眼标定程序代码_标定系列一 | 机器人手眼标定的基础理论分析

旷视MegMaster机器人系列是旷视自主研发的一系列AI智能机器人硬件设备&#xff0c;基于旷视全球领先的人工智能算法及机器人技术&#xff0c;可实现搬运、分拣、托举、存储等功能&#xff0c;被广泛应用于物流仓储、工厂制造等场景。旷视SLAM组主要负责多传感器建图、定位、标定…

Java8中的外观(JavaFX8)

JavaFX8在外观方面进行了一些更改 &#xff0c;其中最相关的是新CSS API &#xff0c;它允许您为控件以及已公开的Skin类创建新CSS属性和伪类。 使用CSS可以改变控件的很多外观&#xff0c;但是CSS只能实现很多功能&#xff0c;而这正是Skin类的用处。从“ UI控件体系结构”快…