express搭建增删改查本地JSON后台(示例)

文件结构

avatar

app.js

const express = require('express');
const os = require('os');
const fs = require('fs');
const bodyParser = require('body-parser'); //调用模板
const app = express();
const PATH = '/mock/'; //json路径
const VIEWPATH = '/view/';
const PATHNAME = 'data'; //json文件名
// 允许访问静态文件
app.use('/assets', express.static('assets'));
app.use(express.static('view'));
app.use('/mock', express.static('mock'));
//创建application/json解析
app.use(bodyParser.urlencoded({
    extended: true
}));
// 查
app.get('/getinfo', function (req, res) {
    const query = req.query; //get请求 获取参数
    console.log(__dirname + PATH + PATHNAME + '.json')
    fs.readFile(__dirname + PATH + PATHNAME + '.json', function (err, data) {
        if (err) {
            console.error(err);
        }
        let datas = data.toString();
        datas = JSON.parse(datas);
        if (query && query.id) {
            datas = datas.data.filter(item => String(item.id) === String(query.id))[0];
        }
        res.send(datas);
    });
});
// 增
app.post('/add', function (req, res) {
    const query = req.body; //post请求 获取参数
    fs.readFile(__dirname + PATH + PATHNAME + '.json', function (err, data) {
        if (err) {
            console.error(err);
        }
        if (query) {
            if (!query.hasOwnProperty("details")) {
                res.send({
                    resCode: 1,
                    responseText: 'details为必填项'
                });
                return;
            }
            let datas = data.toString();
            datas = JSON.parse(datas);
            // 数据排序
            datas.data.sort((a, b) => a.id - b.id);
            // 添加 新对象
            query.id = datas.data.length;
            datas.data.push(query);
            const datasStr = JSON.stringify(datas);
            fs.writeFile(__dirname + PATH + PATHNAME + '.json', datasStr, function (err) {
                if (err) {
                    console.error(err);
                }
                res.send({
                    resCode: 1,
                    responseText: '添加成功!'
                });
            });
        }
    });
});
// 删
app.post('/del', function (req, res) {
    const query = req.body; //post请求 获取参数
    fs.readFile(__dirname + PATH + PATHNAME + '.json', function (err, data) {
        if (err) {
            console.error(err);
        }
        if (query && query.id) {
            let datas = data.toString();
            datas = JSON.parse(datas);
            // 查找id
            const delIndex = datas.data.findIndex(item => String(item.id) === String(query.id));
            datas.data.splice(delIndex, 1);
            // 删除
            const datasStr = JSON.stringify(datas);
            fs.writeFile(__dirname + PATH + PATHNAME + '.json', datasStr, function (err) {
                if (err) {
                    console.error(err);
                }
                res.send({
                    resCode: 1,
                    responseText: '删除成功!'
                });
            });
        }
    });
});
// 改
app.post('/updateDetails', function (req, res) {
    const query = req.body; //post请求 获取参数
    fs.readFile(__dirname + PATH + PATHNAME + '.json', function (err, data) {
        if (err) {
            console.error(err);
        }
        if (query && query.id) {
            let datas = data.toString();
            datas = JSON.parse(datas);
            // 查找id
            if (isJSON(decodeURIComponent(query.jsonModel))) {
                for (const item of datas.data) {
                    if (String(item.id) === String(query.id)) {
                        item.details = JSON.parse(decodeURIComponent(query.jsonModel));
                    }
                }
            } else {
                resErrorCode(res);
                return;
            }
            // 修改
            const datasStr = JSON.stringify(datas);
            fs.writeFile(__dirname + PATH + PATHNAME + '.json', datasStr, function (err) {
                if (err) {
                    console.error(err);
                }
                res.send({
                    resCode: 1,
                    responseText: '修改成功!'
                });
            });
        }
    });
});
// 测试链接
app.get('/', function (req, res) {
    res.sendFile(__dirname + VIEWPATH + "index.html");
});

//监听
let server = app.listen(3000, function () {
    const myHost = getIPAdress();
    const port = server.address().port
    console.log("接口地址为 http://" + myHost + ':' + port)
});
//获取本机ip
function getIPAdress() {
    const interfaces = os.networkInterfaces();
    for (const devName in interfaces) {
        const iface = interfaces[devName];
        for (let i = 0; i < iface.length; i++) &#123;
            const alias = iface[i];
            if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) &#123;
                return alias.address;
            &#125;
        &#125;
    &#125;
&#125;
// 获取对象键值对 数量
function getObjLength(obj) &#123;
    return Object.keys(obj).length;
&#125;
/*返回错误信息*/
function resErrorCode(res) &#123;
    res.send(&#123;
        errorCode: 1,
        responseText: '添加参数有误,请联系后台确认提交参数要求!'
    &#125;);
&#125;
// 判断是否是JSON字符串
function isJSON(str) &#123;
    if (typeof str == 'string') &#123;
        try &#123;
            var obj = JSON.parse(str);
            if (typeof obj == 'object' && obj) &#123;
                return true;
            &#125; else &#123;
                return false;
            &#125;

        &#125; catch (e) &#123;
            console.log('error:' + str + '!!!' + e);
            return false;
        &#125;
    &#125;
    console.log('It is not a string!')
&#125;

此基础示例为express入门示例,仅可用于前端配合mock插件自己模拟对接后台使用。
真要拿node做后台,需配合自己用的数据库,学习熟练SQL语法对数据库进行增删改查操作。
学习没有捷径可言,真要做好一个node后台,还要下很多功夫,也需要多个项目坑坑洼洼的磨练,加油吧。


 上一篇
基于elementUI表头筛选组件封装 基于elementUI表头筛选组件封装
引用方式推荐main.js里全局引用: import ElTableColumnPro from './components/ElTableColumnPro.vue'; ElTableColumnPro.install =
2019-09-30
下一篇 
优秀文章收录 优秀文章收录
安全 竞争激烈的互联网时代,是否需要注重一下WEB安全? -2019年05月15日 网络、浏览器基础 你不知道的浏览器页面渲染机制 -2019年04月02日 面试的信心来源于过硬的基础 -2018年02月23日 http 缓存小结 201
  目录