一个包含express+mock.js+mongoDB简单的node后端服务示例

本文介绍了一个使用Node.js搭建的模拟API服务,该服务利用Express框架实现RESTful API,并使用Mock.js生成虚拟数据,同时集成了MongoDB进行数据存储。文章详细展示了如何处理HTTP请求、跨域设置及数据模拟。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

server.js

mock用于模拟生成数据,mongoDB是数据库

const Mock = require('mockjs');
const express = require('express')
const server = express()
const bodyParser = require('body-parser')
server.use(bodyParser.json());
server.use(bodyParser.urlencoded({ extended: false }));

const path = require('path')
// 引入数据库 mongoDB
const db = require('ykt-mongo');
const col = db.collection('novel');

// test
col.insert({name:'test',text:'NOVEL'})

//服务器所有接口跨域访问设置
server.all('*', function(req, res, next) {
	// 设置请求头为允许跨域
	res.header('Access-Control-Allow-Origin', '*');
	// 设置服务器支持的所有头信息字段
	res.header(
		'Access-Control-Allow-Headers',
		'Content-Type, Content-Length, Authorization, Accept, X-Requested-With , yourHeaderFeild, sessionToken'
	);
	// 设置服务器支持的所有跨域请求的方法
	res.header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');
	if (req.method.toLowerCase() == 'options') {
		// res.send(200); // 让options尝试请求快速结束
		res.sendStatus(200)
	} else {
		next();
	}
});

function getData(param) {
	return Object.assign({
		code: 10000,
		msg: '操作成功',
		data: {}
	}, param);
}

// ==========================================================================
//虚拟数据
const sql_user = {
	'admin': {
		pwd: 123,
		info: {
			username: 'admin',
			name: '小明',
			sex: '男',
			//1:管理员;2:普通用户
			type: 1
		}
	},
	'ljs': {
		pwd: 3305,
		info: {
			username: 'ljs',
			name: 'wqLius',
			sex: '男',
			//1:管理员;2:普通用户
			type: 1
		}
	}
}

// ==========================================================================
//接口
//登录
server.post('/api/login', (request, responce) => {
	const { username, password } = request.body;
	const data = sql_user[username];
	if (data) {
		if (data.pwd == password) {
			responce.json(getData({ msg: '登录成功', data: data.info }))
		} else {
			responce.json(getData({
				msg: '密码错误',
				code: 10001
			}))
		}
	} else {
		responce.json(getData({
			msg: '用户名不存在',
			code: 10002
		}))
	}
})
//退出
server.get('/api/exit', (request, responce) => {
	responce.json(getData({ msg: '退出成功' }))
})

/* 学生相关*/
// {id:编号	num:学号	name:姓名	className:班级	birth:生日	phone:手机	major:专业	address:地址	score::评分}
function getStudentList(className = '计算机一班') {
	return Mock.mock({
		'page': 1,
		'count': 28,
		'list|10-100': [{
			'id|+1': 1,
			'num|+1': 1,
			'name': '@cname',
			'sex|1': ['男', '女'],
			'birth': '@date',
			//'major': '@ctitle',
			'major|1': ['计算机科学与技术','软件工程','JavaScript ES8','大数据','人工智能','软件技术',
						'汉语言文学','人力资源管理','英语','信息安全','智能医疗','生物科技'],
			'address': '@county(true)',
			'score|20-100': 1,
			phone() {
				let { num } = Mock.mock({ 'num|11111111-9999999': 1 })
				return `136${num}`;
			},
			className
		}]
	})
}
const studentList = getStudentList()
server.post('/api/student/add', (request, responce) => {
	let fields = ['num', 'name', 'className', 'birth', 'phone', 'major', 'address', 'score'];
	const dd = request.body || {};
	const { list } = studentList;
	if (fields.every(field => dd[field])) {
		dd.id = list.length + 1
		list.push(dd);
		responce.json(getData({ data: studentList }))
	} else {
		responce.json(getData({ msg: '学生信息不完整', code: 10003 }))
	}
})
server.get('/api/student/delete', (request, responce) => {
	const dd = request.query || {};
	const { list } = studentList;
	if (dd.id) {
		let idx = list.findIndex(item => item.id == dd.id);
		if (idx === undefined) {
			responce.json(getData({ msg: '找不到对应的学生', code: 10003 }))
		} else {
			list.splice(idx, 1)
			responce.json(getData({ data: studentList }))
		}
	} else {
		responce.json(getData({ msg: '学生id为必要参数', code: 10003 }))
	}
})
server.post('/api/student/edit', (request, responce) => {
	const dd = request.body || {};
	const { list } = studentList;
	if (dd.id) {
		let item = list.find(item => item.id == dd.id);
		if (item) {
			Object.assign(item, dd)
			responce.json(getData({ data: studentList }))
		} else {
			responce.json(getData({ msg: '找不到对应的学生', code: 10003 }))
		}
	} else {
		responce.json(getData({ msg: '学生id为必要参数', code: 10003 }))
	}
})
server.get('/api/student/list', (request, responce) => {
	const { field, text, page = 1 } = request.query || {};
	const { list } = studentList;

	let data = { page, count: list.length };
	let start = (page - 1) * 10;
	let end = page * 10;

	if (field && text) {
		data.list = list.filter(item => item[field].toString().includes(text)).slice(start, end)
	} else {
		data.list = studentList.list.slice(start, end)
	}
	responce.json(getData({ data }))
})

// 指定服务器运行端口8080
server.listen(8080)
console.log('Server running at http://localhost:8686')

console.log('path=',path.join(__dirname));


const App = express();		//实例化一个express
/* 通过服务端口访问页面
	设置服务资源文件位置 public
	将html文件放在 public文件夹下,
	即可使用 http://127.0.0.1:3305/index.html 访问index.html
	或 http://192.168.0.100:3305/index.html  本机在局域网中的ip
*/
 App.use(express.static("./public")).listen('3305');{
   console.log('App listening at port 3305');
   console.log('Use http://192.168.0.100:3305/index.html  to index.html');
 }





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值