基于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来 ...
随机推荐
- 项目实训DAY6
今天主要的工作是把功能界面丰富了一下,查阅了一下论文,将页面中添加了可视化元素:同时决定了最后几天的工作计划.
- Vue 二维码生成插件
1. 安装 qrcode.vue 仓库地址 // vue2 安装1.x版本.vue3 安装3.x版本 npm install --save qrcode.vue // 或 yarn add qrcod ...
- cobbler安装CentOS-8系统
cobbler安装CentOS-8系统 cobbler 1. cobbler简介 2. cobbler服务端部署 3. 客户端安装 4. 定制安装 1. cobbler简介 Cobbler是一个Lin ...
- CSS 常用样式-盒模型属性
盒模型又叫框模型,包含了五个用来描述盒子位置.尺寸的属性,分别是宽度 width.高度 height.内边距 padding. 边框 border.外边距 margin. 常见盒模型区域: • 盒模型 ...
- OSIDP-虚拟内存-08
硬件和控制结构 实际内存管理特点 1.一个进程可以在执行过程中换入换出内存,因而在内存中的位置可以不断变化. 2.一个进程可以划分为多个块,这些块位于内存中的地址不需要是连续的. 进程执行的任何时候都 ...
- jquery的ajax方法获取不到return返回值
/** 2 * 方式:(1)同步调用 (2)在ajax函数中return值 3 * 结果:返回 1.未成功获取返回值 4 * 失败原因:ajax内部是一个或多个定义的函数,ajax中return返回值 ...
- [C++] epoll server实例
// IO多路复用,事件驱动+非阻塞,实现一个线程完成对多个fd的监控和响应,提升CPU利用率 // epoll优点: // 1.select需要每次调用select时拷贝fd,epoll_ctl拷贝 ...
- 转载·Pycharm Pro“This license 56ZS5PQ1RF has been cancelled” 激活码失效处理记录
今天打开许久没用的Pycharm提示激活码过期,激活提示:"This license 56ZS5PQ1RF has been cancelled" 解决方法如下 首先修改hosts ...
- 什么是DI
属性的依赖注入,spring在通过IOC创建对象的时候,如果对象还有属性,就一并给赋值进去DI是在IOC的基础上进行对象的属性注入
- 剑指offer----1.二维数组查找
题目:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...