基于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来 ...
随机推荐
- React之一个组件的诞生
此处以input组件为例 input.js import React from 'react' class Input extends React.Component { // ps:使用static ...
- C语言——函数
C 语言中的函数定义形式: return_type function_name( parameter list ) //函数头 { //函数体 body of the function } 返回类型: ...
- 人森第一个iOS app,写给我家baby的!纪念一下
用python写的,对于非专业iOS开发来说,py是个不错的选择,使用beeware框架,感觉和写前端差不多
- 2023.1.21 app后端pyinstaller启动
1.打包后会在dist文件夹中暂时生成一个新的文件目录,点击app.exe后也是在这个暂时的文件目录下读取文件的,所以需要以下代码拷贝添加原始项目中的文件 pyinstaller -D app.py ...
- C#实现统一登录(SSO)
SSO的基本概念 SSO英文全称Single Sign On(单点登录).SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他应用中用于同 ...
- 字符流 -->字符节点流 FlieWrite 用法 FileReader 用法
1创建字符输出节点流(采用的是环境默认的编码)FileWriter fw = new FileWriter("存值的路径");2输出内容fw.write(2209);可以建立数组来 ...
- MySQL_20200417
MySQL安装与卸载 SQL语句与Oracle大致相同 主要使用 Navicat for MySQL进行数据库操作 MySQL常用的命令: 登录:mysql -uroot -p /mysql -ur ...
- element的el-table使用模板插槽在火狐和IE无法显示tooltip(浏览器兼容)
el-table中使用show-overflow-tooltip属性,配合tooltip出现的浏览器兼容性问题 el-table中使用show-overflow-tooltip属性内容过长被隐藏时显示 ...
- [Leetcode 22]生成括号generate parentheses
题目 给定括号对数n,生成所有可能的标准括号结果* *指不能)( https://leetcode.com/problems/generate-parentheses/ Given n pairs o ...
- 关于 layui 弹出一个 DOM 表单的问题
案例: 假设用 layer.msg 去弹出一个dom表单: 由官方文档可知,应该定义一个div,设置其 id 为某个值,然后写在 content 中: layer弹层组件开发文档 - Layui 但 ...