借鉴了下面这篇文章,写了自己的express增删改查
https://segmentfault.com/a/1190000018087665
想使用nodejs(express)搭建一个完整的前后端,完成数据的增删改查,又不想使用数据库,那使用json文件吧。
以下node.js使用了淘宝镜像
1、先全局安装express
cnpm i express -g
2、安装express的脚手架工具 express-generator
cnpm i -g express-generator
3、初始化文件
npm init
4、安装脚手架
express -e
5、根目录下创建data文件夹,放置json文件
[
{"id": 1, "name": "苹果", "price": 10},
{"id": 2, "name": "香蕉", "price": 5},
{"id": 3, "name": "梨子", "price": 8},
{"id": 4, "name": "火龙果", "price": 20}
]
6、以下是router里index的代码,使用nanoid动态生成唯一id
var express = require('express');
var router = express.Router();
var path = require('path');
var fs = require('fs');
var nanoid = require('nanoid');
/* GET home page. */
router.get('/', function (req, res, next) {
res.send('什么也没有哦!');
});
// 获取列表
router.get('/list', async (req, res, next) => {
// 两种查询方式 1.id为空 => 查询全部 2.id有值 => 查询单个
var id = req.query.id
var findJson = () => {
return new Promise((resolve, reject) => {
fs.readFile(path.join(__dirname, '../data/fruits.json'), function (err, data) {
if (err) {
resolve({ code: 500, msg: '查询失败' + err })
return console.error(err);
}
var jsonData = data.toString();//将二进制的数据转换为字符串
jsonData = JSON.parse(jsonData);//将字符串转换为json对象
// 有id值=>单个 无id值=>全部
if (id) {
jsonData = jsonData.find((item) => item.id == id);
resolve({ code: 200, data: jsonData, msg: '查询成功' })
} else {
resolve({ code: 200, data: jsonData, msg: '查询成功' })
}
})
})
}
var data = await findJson()
res.send(data)
})
// 新增
router.post('/add', async (req, res, next) => {
// 这里使用的bodyParser来解析post请求传来的数据,id是用来查找之前有的数据并进行修改,新增数据的在前台应该将id设置为空
var params = req.body
var writeJson = () => {
return new Promise((resolve, reject) => {
// fs模块读取json文件 对fs、path模块不熟悉的可以去查下官方文档
fs.readFile(path.join(__dirname, '../data/fruits.json'), function (err, data) {
if (err) {
// 报错返回
resolve({ code: 500, msg: '新增失败' + err })
return console.error(err);
}
var jsonData = data.toString();//将二进制的数据转换为字符串
jsonData = JSON.parse(jsonData);//将字符串转换为json对象
// 加上id
params.id = nanoid.nanoid()
// 有重复 => 返回500 无重复 => 将params加到json数组末尾
var hasRepeat = jsonData.filter((item) => item.id == params.id);
hasRepeat.length > 1 ? resolve({ code: 500, msg: '新增失败,有重复项目id' }) : jsonData.push(params);
//因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
var str = JSON.stringify(jsonData);
fs.writeFile(path.join(__dirname, '../data/fruits.json'), str, function (err) {
if (err) {
resolve({ code: 500, msg: '新增失败' + err })
}
resolve({ code: 200, msg: '新增成功' })
})
})
})
}
// 返回给前端
var data = await writeJson()
res.send(data)
})
// 修改
router.put('/update', async (req, res, next) => {
// 这里使用的bodyParser来解析post请求传来的数据,id是用来查找之前有的数据并进行修改,新增数据的在前台应该将id设置为空
var id = req.body.id
var params = req.body
var writeJson = () => {
return new Promise((resolve, reject) => {
// fs模块读取json文件 对fs、path模块不熟悉的可以去查下官方文档
fs.readFile(path.join(__dirname, '../data/fruits.json'), function (err, data) {
if (err) {
// 报错返回
resolve({ code: 500, msg: '修改失败' + err })
return console.error(err);
}
var jsonData = data.toString();//将二进制的数据转换为字符串
jsonData = JSON.parse(jsonData);//将字符串转换为json对象
// 有id值=>修改
jsonData.splice(jsonData.findIndex(item => item.id == id), 1, params)
//因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
var str = JSON.stringify(jsonData);
fs.writeFile(path.join(__dirname, '../data/fruits.json'), str, function (err) {
if (err) {
resolve({ code: 500, msg: '修改失败' + err })
}
resolve({ code: 200, msg: '修改成功' })
})
})
})
}
// 返回给前端
var data = await writeJson()
res.send(data)
})
// 删除
router.delete('/delete/:id', async (req, res, next) => {
var id = req.params.id
var deleteJson = () => {
return new Promise((resolve, reject) => {
fs.readFile(path.join(__dirname, '../data/fruits.json'), function (err, data) {
if (err) {
resolve({ code: 500, msg: '删除失败' + err })
return console.error(err);
}
var jsonData = data.toString();//将二进制的数据转换为字符串
jsonData = JSON.parse(jsonData);//将字符串转换为json对象
// 过滤出所存item的id和前端传来id不等的 item ,下面提供了两种方法filter和splice
// jsonData = jsonData.filter((item) => item.id + '' !== id);
var index = jsonData.findIndex(item => item.id == id)
if (index === -1) {
resolve({ code: 500, msg: '没有该项,无法删除' })
} else {
jsonData.splice(index, 1)
var str = JSON.stringify(jsonData);
fs.writeFile(path.join(__dirname, '../data/fruits.json'), str, function (err) {
if (err) {
resolve({ code: 500, msg: '删除失败' + err })
}
resolve({ code: 200, msg: '删除成功' })
})
}
})
})
}
var data = await deleteJson()
res.send(data)
})
module.exports = router;