乐趣区

使用Express开发小说API接口服务1.0(一)

使用 Express 开发小说 API 接口服务 1.0(一)
1.0 版本技术栈使用 express-generator、express、request、morgan、file-stream-rotator。接口用追书神器 API。目前接口设计有首页,小说详情页,搜索,小说文章列表页,排行 API。<!–more–>
github 创建仓库
先创建一个仓库放文件然后克隆创建好的仓库
git clone https://github.com/lanpangzhi/novel-api.git
安装 express-generator 快速生成项目
npm install -g express-generator
然后再之前克隆仓库的上一级目录执行
express –no-view novel-api
cd novel-api
npm install
npm install request file-stream-rotator -S
// Linux MacOS
DEBUG=novel-api:* & npm start
// windows
set DEBUG=novel-api:* & npm start
生成好的目录结构和文件
设置 cors 跨域
打开项目根目录 app.js, 放在路由上面。
app.all(‘*’, function (req, res, next) {
res.header(“Access-Control-Allow-Origin”, “*”);
res.header(“Access-Control-Allow-Headers”, “Origin, X-Requested-With, Content-Type, Accept”);
res.header(“Access-Control-Allow-Methods”, “PUT,POST,GET,DELETE,OPTIONS”);
res.header(“X-Powered-By”, ‘ 3.2.1’)
res.header(“Content-Type”, “application/json;charset=utf-8”);
next()
});
日志写入本地文件
按时间分割 log 日志并写入本地磁盘,需要在 app.js 文件中引入 fs 和 file-stream-rotator 模块。
let fs = require(‘fs’);
let FileStreamRotator = require(‘file-stream-rotator’); // 日志按时间分割模块

// 下面代码写在 var app = express(); 下面
let logDir = path.join(__dirname, ‘log’);

// 检查是否存在 logDir 这个目录没有则创建
fs.existsSync(logDir) || fs.mkdirSync(logDir);

// 日志分割流
let accessLogStream = FileStreamRotator.getStream({
date_format: ‘YYYYMMDD’,
filename: path.join(logDir, ‘access-%DATE%.log’),
frequency: ‘daily’,
verbose: false
});

// 日志中间件
app.use(logger(‘combined’, { stream: accessLogStream}));
创建公共文件
项目根目录创建 common 文件夹,再里面再新建一个 common.json 文件
{
“API”: “http://api.zhuishushenqi.com”,
“PIC”: “http://statics.zhuishushenqi.com”,
“CHAPTER”: “http://chapter2.zhuishushenqi.com”
}
API 域名: http://api.zhuishushenqi.com 图片域名: http://statics.zhuishushenqi.com 章节域名: http://chapter2.zhuishushenqi…
首页接口
1.0 版本首页接口直接返回最热榜前 20 条数据。修改 app.js 文件路由中间件配置
app.use(‘/index’, indexRouter);
修改 routes/index.js 文件
let express = require(‘express’);
let request = require(‘request’);
let common = require(‘../common/common.json’); // 引用公共文件
let router = express.Router();

/**
首页数据追书最热榜 Top100
获取单一排行榜
http://api.zhuishushenqi.com/ranking/{rankingId}
*/
router.get(‘/’, function(req, res, next) {
// 请求追书最热榜 Top100
request.get(`${common.API}/ranking/54d42d92321052167dfb75e3`, function (error, response, body) {
if (error){
res.send(JSON.stringify({“flag”: 0, “msg”: “ 请求出错了 …”}));
}

// 解析返回数据取前 20 条,并添加图片 url 链接
body = JSON.parse(body);

if (body.ok){
let books = body.ranking.books.slice(0, 19);
books.forEach(element => {
element.cover = common.PIC + element.cover;
});

res.send(JSON.stringify({ “flag”: 1, “books”: books, “msg”: “OK”}));
}else{
res.send(JSON.stringify({ “flag”: 0, “msg”: “rankingId 有问题 ”}));
}
});
});

module.exports = router;
访问 http://localhost:3000/index 就可以看到返回的数据了。
搜索接口
1.0 版本的搜索接口只取前 40 条数据,可以模糊查询。修改 app.js 文件路由中间件配置,把 users 删掉。
let searchRouter = require(‘./routes/search’);
app.use(‘/search’, searchRouter);
然后把 routes 文件夹下面的 users.js 删除,新建 search.js
let express = require(‘express’);
let request = require(‘request’);
let common = require(‘../common/common.json’); // 引用公共文件
let router = express.Router();

/**
模糊搜索接口
返回模糊搜索前 40 条数据
http://api.zhuishushenqi.com/book/fuzzy-search?query={name}
*/
router.get(‘/’, function(req, res, next) {
// 判断 query 参数有没有传递过来
if (req.query.query){
// req.query.query 编码转义
let query = encodeURIComponent(req.query.query);
request.get(`${common.API}/book/fuzzy-search?query=${query}`, function (error, response, body) {
if (error){
res.send(JSON.stringify({ “flag”: 0, “msg”: “ 请求出错了 …”}));
}

// 解析返回数据
body = JSON.parse(body);

if (body.ok){
if (body.books.length == 0){
res.send(JSON.stringify({ “flag”: 0, “msg”: “ 没有找到书籍,换个名字试试吧。”}));
}

// 取前 40 条,并添加图片 url 链接
let books = body.books.slice(0, 39);
books.forEach(element => {
element.cover = common.PIC + element.cover;
});

res.send(JSON.stringify({ “flag”: 1, “books”: books, “msg”: “OK”}));
}else{
res.send(JSON.stringify({ “flag”: 0, “msg”: “ 请求出错了 …”}));
}
});
}else{
res.send(JSON.stringify({“flag”: 0, “msg”: “ 请传入 query 参数 ”}));
}

});

module.exports = router;
访问 http://localhost:3000/search/?query= 遮天 就可以看到返回的数据了。
喜欢可以去 github 送个 star 谢谢
我的博客和 GitHub 地址
https://github.com/lanpangzhi
http://blog.langpz.com
参考
https://github.com/expressjs/morganhttps://juejin.im/entry/593a3fdf61ff4b006c737ca4https://github.com/jianhui1012/bookreader/wiki/API-%E6%8E%A5%E5%8F%A3%E6%96%87%E6%A1%A3

退出移动版