使用Express開發小說API介面服務1.0(一)
1.0版本技術棧使用express-generator、express、request、morgan、file-stream-rotator。介面用追書神器API。 目前介面設計有首頁,小說詳情頁,搜尋,小說文章列表頁,排行API。
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.com
首頁介面
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地址
參考
github.com/expressjs/m… juejin.im/entry/593a3… github.com/jianhui1012…