node.js无数据库,使用express+json形式实现增删改查

借鉴了下面这篇文章,写了自己的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;

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值