suke`s Notice
hexo博客
express试水(1)「大淘客api」😎

安装

npm init

npm install express –save

快速生成项目

npm install -g express-generator

express newApp

基础目录

bin/www

www配置文件,某些插件会把log文件写在这里

public

静态资源文件,需要在入口文件挂载才可以访问

1
2
//static是一个虚拟目录 可以直接用 root目录
app.use('/static',express.static(path.join(__dirname, 'public')));

routes

路由文件

views

模板文件,可自定义程度很高 还没有详细了解过,暂时倾向于前后端分离,只写接口在这里

app.js

入口文件,大部分的配置都可以在这里完成
使用插件 cookie jsonparse 这些都需要引用插件实现,模板项目中已经生成了常用的插件
自定义模板
定义路由

Curl接第三方接口

这里使用大淘客的api做的尝试,没有具体项目逻辑想不到应该做什么,另外数据库也还没尝试

demo

https://github.com/Treblex/dataoke-api/blob/master/server/util/CommodityFactory.js

新建一个文件夹放自己的工具类就可以,对文件夹结构没有强制对要求,对应的调用方法在 router/api.js

Request

直接调用request模块就可以,使用方法也非常的简单,符合前端的习惯

1
2
const request = require('request');
request({data},callback=(err,res,body)=>{})

验签

在大淘客的demo中,引用了corypt md5进行加密,这里需要注意不要在引用文件后就立即createHash('md5'),因为每个实例只能进行一次加密,在需要的地方createHash('md5')就可以了

1
crypto.createHash('md5')

调用

https://github.com/Treblex/dataoke-api/blob/master/server/routes/api.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
var express = require('express');
var router = express.Router();
var factory = require('../util/CommodityFactory')
// 商品工厂对象
let CommodityFactory = new factory({
appSecret: '17eda35413998548b3fdebd31e6d2c51',
appKey: '5dc6fcef48989'
})
// 临时写的
const errCode = (title) => {
return {
time: new Date() * 1,
code: -1,
msg: title,
data: {}
}
}
// 品牌
router.get('/get-brand-list', async function (req, res, next) {
let {
pageId,
pageSize = 10
} = req.query
// req.query 请求的参数,
// 如果需要支持类似thinkphp的静态url url地址可以写成 '/detail/:id'
// 取值使用 req.params['id'],如果有正则,正则的部分为 req.params[index]
if (!pageId) {
res.send(errCode("pageId不可空"))
}
let body = await CommodityFactory.getBarndList({
pageId,
pageSize
})

// 返回页面显示的内容,在此之前可以设置返回的header 等一些常用内容
res.send(body)
// res.render('index', { title: 'Express' ,中文:"打火机卡上打哈电话接啊活动空间啊"});
// 渲染到模板的写法,第一个参数模板名字,第二个为渲染到模板的变量
})

中间件开发

官网文档>>

我的理解是中间件在php中类似于一个base控制器,

1
2
3
4
5
6
7
8
9
10
class loginBase{
// 检查登录,跳转页面
if(isLogin){
return true
}
// 301 login.html
}
class home extends loginBase{
return home
}


像文档中介绍的,其实我们定义的路由也是中间件
我能想到的常用的业务场景就是像上边的 登录检测,用户权限这些

1
2
3
4
5
6
7
8
9
10
app.use('/api',(res,req,next)=>{
console.log('==err==||AppBase 登录检测或一些其他的内容');
let islogin = false
if(!islogin){
req.send('err 未登录什么的'),//如果不执行下一步业务逻辑,我们就必须结束请求,而不能直接return,否则页面会一直处于加载中,直到请求超时
return;
}
next();//执行下一步 api的路由文件
})
app.use('/api', apiRouter);//自定义路由 业务逻辑

End

还没有部署,客户端没写,接口都对了,下面是github仓库
https://github.com/Treblex/dataoke-api

其实遇到一个问题没有解决,request大淘客接口的时候又一个 version参数,这个参数有的接口是1.0.0 有的是1.0.1,而且有过期验证,过期的版本无法使用,对于怎么更新接口版本和过期通知没有太好解决方法,现在version是在factory的每个请求里边写的默认参数