node.js 接口设计篇
1.要清晰认识到这个服务是怎么架构
2.比如说采用什么数据库
3.使用什么ORM模型版本
4.是否需要一些安全认证
5.以及一些用户机制
简单的服务接口设计
这个设计很简单,写入的时候,把数据写成 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;