node.js 接口设计篇

1.要清晰认识到这个服务是怎么架构
2.比如说采用什么数据库
3.使用什么ORM模型版本
4.是否需要一些安全认证
5.以及一些用户机制


简单的服务接口设计

E9D383AAF3F91C72D66ACCE36CB3B7E3

这个设计很简单,写入的时候,把数据写成 json文件,然后获取的时候把数据从 json文件处读取。


接口

笑料数据列表接口: /data/read?type=cookies
互联网资讯接口: /data/read?type=it
管理数据列表接口: /data/read?type=manager
散文数据列表接口: /data/read?type=sanwen
阅读模块配置接口: /read?type=config

创建 data文件夹,专门存放上述接口数据的文件。
路径为:myservice/public/data

cookies.json
it.json
manager.json
sanwen.json
config.json

初始值为数据:

[]

简单的模块

读取模块
写入模块

在 routes 文件夹下面创建一个名为 data.js 的文件。
路径为:myservice/routes/data.js

引入 data.js 文件到 app.js

var data = require('./routes/data');

在 app.js 中设置 data.js 路由

app.use('/data', data);

data.js的源码

var express = require('express');
var router = express.Router();
var fs = require('fs')
var PATH = './public/data/';



//读取数据模块(供客户端使用)
//data/read?type=it
//实际就是data/read?type=it.json
router.get('/read', function(req, res, next) {
    var type = req.param('type') || '';
    fs.readFile(PATH + type + '.json', function (err, data) {
        if (err) {
            return res.send({
                status:0,
                info:'读取文件出现异常'
            });
        }

        var COUNT = 50;

        //异常处理
        var obj = [];
        try {
            obj = JSON.parse(data.toString());
        } catch (e) {
            obj = [];
        }

        //超出 COUNT 的数据多少限制,则取最新的 COUNT 个数据
        if (obj.length > COUNT) {
            obj = obj.slice(0, COUNT);
        }

        return res.send({
            status:1,
            data:obj
        });
    });
});

//数据存储模块(后台开发使用)
router.post('/write', function (req, res, next) {
    //文件名
    var type = req.param('type') || '';
    //关键字段
    var url = req.param('url') || '';
    var title = req.param('title') || '';
    var img = req.param('img') || '';
    if (!type || !url || !title || !img) {
        return res.send({
            status:0,
            info:'提交的字段不全'
        });
    }
    //1、读取文件
    var filePath = PATH + type + '.json';
    fs.readFile(filePath, function (err, data) {
        if (err) {
            return res.send({
               status:0,
               info: '读取数据失败'
            });
        }

        var arr = JSON.parse(data.toString());
        var obj = {
            img: img,
            url: url,
            title: title,
            id: guidGenerate(),
            time: new Date()
        };
        arr.splice(0, 0, obj);

        //2、写入文件
        var newData = JSON.stringify(arr);
        fs.writeFile(filePath, newData, function (err) {
            if (err) {
                return res.send({
                   status:0,
                   info:'写入文件失败'
                });
            }
            return res.send({
                status:1,
                data:obj
            });
        });
    });
});

//阅读模块写入接口(后台开发使用)
router.post('/write_config',function (req, res, next) {
    //TODO:后期进行提交数据的验证
    //防xss攻击 xss
    //npm install xss
    //require('xss')
    //var str = xss(name);
    var data = req.body.data;

    var obj = [];
    try {
        obj = JSON.parse(data.toString());
    } catch (e) {
        obj = [];
    }

    var newData = JSON.stringify(obj);
    //写入
    fs.writeFile(PATH + 'config.json', newData, function (err) {
        if (err) {
            return res.send({
                status:0,
                info:'写入数据失败'
            });
        }
        return res.send({
            status:1,
            info:obj
        });
    })

});

//guid
function guidGenerate() {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0,
            v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    }).toUpperCase();
}

module.exports = router;