基于express、node与mongodb写后端接口
1、首先运行mongodb,建立一个数据库。(前提是你的电脑已经装了mongodb)
先打开一个命令窗口打开mongodb
cd /usr/local
cd mongodb/bin
./mongod --dbpath=/Users/heyu/data
再打开一个命令窗口运行
mongodb cd /usr/local
cd mongodb/bin
./mongo
创建一个数据库 use xx(数据库名字)
2、创建express项目(基于 Node.js 平台,快速、开放、极简的 Web 开发框架)
npm / cnpm i express-generator -g
express myapp --view=ejs (为什么要选ejs?因为ejs的语法和前端很像,容易看懂)
cd myapp
cnpm / npm i
npm run start
cnpm / npm i supervisor -g (安装supervisor依赖来监听代码的变化从而达到自动启动)
配置了dev指令
dev: supervisor ./bin/www
3、node 连接数据库
const mongoose = require('mongoose'); // 引入模块
const DB_URL = 'mongodb://localhost:27017/heyu'; // 数据库连接地址 // 连接数据库
// mongoose.connect(DB_URL);
mongoose.connect(DB_URL, { useMongoClient: true }); // 数据库连接成功
mongoose.connection.on('connected', () => {
console.log('数据库连接成功')
}) // 数据库断开或者连接失败
mongoose.connection.on('disconnected', () => {
console.log('数据库断开')
}) // 数据库连接异常
mongoose.connection.on('error', () => {
console.log('数据库连接异常')
}) //将文件暴露出去
module.exports = mongoose;
4、封装公用的sql语句(难点)
const sql = {
// 数据库集合靠函数去传递
insert (CollectionName, insertData) {
// 数据库的操作属于异步操作,后续的业务逻辑会交给执行的那个单位
// A 调用了B B包含异步操作,操作完毕 A继续执行业务逻辑
// 异步操作 --- 回调函数 / promise / generator + yeild / async + await
// User.insertMany(insertData, (err) => {
// if (err) throw err;
// console.log('插入成功')
// })
// promise的写法
// return new Promise((resolve, reject) => {
// })
return new Promise((resolve, reject) => {
CollectionName.insertMany(insertData, (err) => {
console.log('insertData',insertData)
if (err) throw err;
resolve()
})
})
},
delete (CollectionName, deleteData, deleteType) {
// User.deleteOne(deleteData, (err) => {})
// User.deleteMany(deleteData, (err) => {}) // style.display = "none" <===> style['display'] = "none"
// style.animation = "test" 兼容性
// 对象后的属性不可以是变量,如果有变量,写成 对象[属性] 形式 deleteType = deleteType || 'deleteOne' // 默认为删除单条数据 return new Promise((resolve, reject) => {
CollectionName[deleteType](deleteData, (err) => {
if (err) throw err;
resolve()
})
})
},
update (CollectionName, whereObj, updateObj, updateType) {
updateType = updateType || 'updateOne'
return new Promise((resolve, reject) => {
CollectionName[updateType](whereObj, updateObj, (err) => {
if (err) throw err;
resolve()
})
})
},
find (CollectionName, whereObj, showObj) {
return new Promise((resolve, reject) => {
CollectionName.find(whereObj, showObj).exec((err, data) => {
if (err) throw err;
resolve(data)
})
})
},
paging (CollectionName, whereObj, showObj, limitNum, pageCode) {
return new Promise((resolve, reject) => {
// limit(limitNum) 每页显示个数
// skip(limitNum * pageCode) // 每页从哪一个开始
CollectionName.find(whereObj, showObj).limit(limitNum).skip(limitNum * pageCode).exec((err, data) => {
if (err) throw err;
resolve(data)
})
})
},
distinct(CollectionName, name) {
return new Promise((resolve, reject) => {
CollectionName.distinct(name).exec((err, data) => {
if (err) throw err;
resolve(data)
})
})
}
} module.exports = sql
5、建表。(我这里建立的是商品栏的表)
const mongoose = require('./../db.js'); // 引入数据库连接模块
const Schema = mongoose.Schema; // 拿到当前数据库相应的集合对象 // 设计用户表的集合
const proSchema = new Schema({ // 设计用户集合的字段以及数据类型
proid: {type: String }, // 商品id
type: { type: String }, // 类型
brand: { type: String }, // 品牌
barndimg: { type: String }, // 品牌图片
proname: { type: String }, // 商品标题
price: { type: Number }, // 商品价格
flag: { type: Number }, // 是否推荐
proimg: { type: String }, // 商品图片
note: { type: String }, // 商品详情
postage: { type: String } // 包邮吗
}) module.exports = mongoose.model('Pro', proSchema);
6、app.js中配置好需要的依赖,将一些接口暴露出来
var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');
var jwt = require('jsonwebtoken');
var indexRouter = require('./routes/index');
var proRouter = require('./routes/pro');
cors = require('cors')
var app = express();
app.use((cors()))//解决跨域
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/pro', proRouter);//商品接口
// catch 404 and forward to error handler
app.use(function(req, res, next) {
next(createError(404));
}); // error handler
app.use(function(err, req, res, next) {
// set locals, only providing error in development
res.locals.message = err.message;
res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page
res.status(err.status || 500);
res.render('error');
}); module.exports = app;
7、先将数据导入到数据库。(excel->mongodb)
var express = require('express');
var xlsx = require('node-xlsx');
var uuid = require('node-uuid');
var Pro = require('./../sql/collection/pros');
var sql = require('./../sql');
var router = express();
var filestr = '/Users/heyu/Desktop/project/mongdb/excel/shop.xlsx';
router.get('/import',(req,res,next) =>{
let obj = xlsx.parse(filestr)[0].data
let arr = []
obj.map((item,index) =>{
if(index !== 0){
arr.push({
proid:"pro_" + uuid.v1(),
type:item[0],
brand:item[1],
barndimg:item[2],
proname:item[3],
price:item[4],
flag:item[5],
proimg:item[6],
note:item[7],
postage:item[8]
})
}
})
sql.insert(Pro,arr).then(()=>{
res.send(arr)
})
})
7、开始写接口
var express = require('express');
var xlsx = require('node-xlsx');
var uuid = require('node-uuid');
var Pro = require('./../sql/collection/pros');
var sql = require('./../sql'); var router = express(); var filestr = '/Users/heyu/Desktop/project/mongdb/excel/shop.xlsx'; router.get('/',function(req,res,next){
let{pageCode,limitNum} = req.query;
pageCode = pageCode * 1 || 0;
limitNum = limitNum * 1 || 10; sql.paging(Pro,{},{_id:0},limitNum,pageCode).then(data =>{
res.send({
code:'200',
success:'查询列表成功',
length:data.length,
data:data
})
})
});
//获取商品详情
router.get('/detail',(req,res,next) =>{
let{proid} = req.query
sql.find(Pro,{proid},{_id:0}).then(data =>{
res.send({
code:'200',
message:'查询该数据成功',
data:data[0]
})
})
}) //获取某一类
router.get('/type',(req,res,next) => {
let {type} = req.query
type = type ||'type'
sql.distinct(Pro,type).then(data =>{
res.send({
code:'200',
success:'获取类型成功',
data:data
})
})
}); // 新增
router.post('/insert',(({body}, res, next) => {
body.proid = "pro_" + uuid.v1()
sql.insert(Pro,body).then((data)=>{
res.send({
code: '200',
message: '插入成功',
data: data
})
}).catch(e=>{
console.log(e)
})
}))
// 获取分类类型对应的品牌
router.get('/category', (req, res, next) => {
let { type } = req.query
sql.find(Pro, { type }, {_id: 0, brand:1, barndimg: 1}).then(data => {
// 数组去重 https://www.cnblogs.com/le220/p/9130656.html
let obj = {}
// 利用reduce方法遍历数组,reduce第一个参数是遍历需要执行的函数,第二个参数是item的初始值
data = data.reduce((item, next) => {
obj[next.brand] ? '' : obj[next.brand] = true && item.push(next)
return item
}, [])
res.send({
code: '200',
message: '获取分类类型列表',
data: data
})
})
}) // 获取品牌类型对应的产品
router.get('/brandcategory', (req, res, next) => {
let { brand } = req.query
sql.find(Pro, { brand: brand }, {_id: 0}).then(data => { res.send({
code: '200',
message: '获取品牌分类列表',
data: data
})
})
}) // 搜索
router.get('/search', (req, res, next) => {
let { text } = req.query
sql.find(Pro, { proname: eval('/' + text + '/') }, {_id: 0}).then(data => { res.send({
code: '200',
message: '搜索列表',
data: data
})
})
}) module.exports = router;
目录如下
基于express、node与mongodb写后端接口的更多相关文章
- 【Node.js】二、基于Express框架 + 连接MongoDB + 写后端接口
在上节,我们讲了如何搭建express环境,现在我们说说如何通过node.js写服务接口给前端调用 1. 首先通过MongoDB建好数据库与表格 例如,我的数据库名字为db_demo,数据库表格为go ...
- SpringBoot写后端接口,看这一篇就够了!
摘要:本文演示如何构建起一个优秀的后端接口体系,体系构建好了自然就有了规范,同时再构建新的后端接口也会十分轻松. 一个后端接口大致分为四个部分组成:接口地址(url).接口请求方式(get.post等 ...
- NODE 基于express 框架和mongoDB的cookie和session认证 和图片的上传和删除
源码地址 https://gitee.com/zyqwasd/mongdbSession 本项目的mongodb是本地的mongodb 开启方法可以百度一下 端口是默认的27017 页面效果 1. 注 ...
- nodejs+express+mongodb写api接口的简单尝试
1:启动mongodb服务 我的mongoDB的安装目录:E:\mongoDB\bin,版本:3.4.9 打开cmd -> e:(进入e盘) -> cd mongoDB/bin(进入mo ...
- 基于Express+Socket.io+MongoDB的即时聊天系统的设计与实现
记得从高中上课时经常偷偷的和同学们使用qq进行聊天,那时候经常需要进行下载qq,但是当时又没有那么多的流量进行下载,这就是一个很尴尬的事情了,当时就多想要有一个可以进行线上聊天的网站呀,不用每次痛苦的 ...
- 基于Node.js的微信JS-SDK后端接口实现
做了一个网站,放到线上,用微信打开,点击分享,可是分享后发给朋友的链接卡片是微信默认自带的,如下: 这标题,描述以及图片是默认自带的,丑不说,分享给别人还以为是盗号网站呢,而接入微信的JSSDK后,分 ...
- mock的使用及取消,node模仿本地请求:为了解决前后端分离,用户后台没写完接口的情况下
借鉴:https://www.jianshu.com/p/dd23a6547114 1.说到这里还有一种是配置node模拟本地请求 (1)node模拟本地请求: 补充一下 [1]首先在根目录下建一个d ...
- Node.js基于Express框架搭建一个简单的注册登录Web功能
这个小应用使用到了node.js bootstrap express 以及数据库的操作 :使用mongoose对象模型来操作 mongodb 如果没了解过的可以先去基本了解一下相关概念~ 首先注 ...
- vue+node+mongodb前后端分离博客系统
感悟 历时两个多月,终于利用工作之余完成了这个项目的1.0版本,为什么要写这个项目?其实基于vuejs+nodejs构建的开源博客系统有很多,但是大多数不支持服务端渲染,也不支持动态标题,只是做到了前 ...
- 【Part1】用JS写一个Blog(node + vue + mongoDB)
学习JS也有一段时间了,准备试着写一个博客项目,前后端分离开发,后端用node只提供数据接口,前端用vue-cli脚手架搭建,路由也由前端控制,数据异步交互用vue的一个插件vue-resourse来 ...
随机推荐
- SQL注入绕过某waf的详细过程。
0x00起因 看到大家都有绕waf的payload,想了想,这样下去不行啊.总不能找人家要吧,于是我开启了电脑,开始我的bypass之路. 0x01过程 准备完毕后,开始,首先判断注入and 1=1 ...
- oracle 锁用户和解锁。
1 批量锁用户--数据库迁移后不允许在连接了 SELECT 'alter user '||username||' account lock;' from dba_users WHERE usernam ...
- https://计算机四级
计算机四级内容: 一,网络工程师 基本要求 1.了解大型网络系统规划.管理方法: 2.具备中小型网络系统规划.设计的基本能力: 3.掌握中小型网络系统组建.设备配置调试的基本技术: 4.掌握企事业单位 ...
- Verilog教程
1. 简介 当用 Verilog 设计完成数字模块后进行仿真时,需要在外部添加激励,激励文件叫 testbench. Verilog 的主要特性: 可采用 3 种不同的方式进行设计建模:行为级描述-- ...
- 2月26日Android学习
今天下载了AndroidStudio,但是不知道为什么java文件一直显示file outside of source root,可能是部分文件没有安装的原因,等文件全部下载完之后再看看.
- springBoot 这货特别火
现在 Spring Boot 非常火,各种技术文章,各种付费教程,多如牛毛,可能还有些不知道 Spring Boot 的,那它到底是什么呢?有什么用?今天给大家详细介绍一下. Spring Boot ...
- 对表单input输入框加特殊符号(正斜杠和反斜杠)校验
<p>图片名称:</p><input type="text" name="afterName" style="heigh ...
- HOOK大法
// 请求头hook 测试网站同花顺 OK var header_old = window.XMLHttpRequest.prototype.setRequestHeader;window.XMLHt ...
- windows环境下本地项目(或gitlab上拉取项目)在Jenkins上自动打包部署 超超超详细!!!!!
一.环境准备 1.下载jdk,官网:http://www.oracle.com/ 2.下载Jenkins,官网:https://www.jenkins.io/ 3.下载Tomcat,官网:http:/ ...
- 利用网络复制安装额外域控制器、利用介质安装额外域控制器、安装RODC额外域控制器
一.拥有多台域控制器的优势 1.分担用户身份验证的负担,改善用户登录的效率 2.容错功能:若有域控制器故障,此时仍然可以有其他正常的域控制器来继续提供服务,因此对用户的服务并不会停止 二.系统提供两种 ...