🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 导入指定目录的所有js文件 ``` const glob = require('glob') const {resolve} = require('path') exports.initSchemas = () => { glob.sync(resolve(__dirname, './schema', '**/*.js')).forEach(require) } ``` # 匹配2个标签中的内容 ~~~ // 包含2个标签在内 $.trim(p.match(/[^<>]+/g) ~~~ # 调用API ~~~ const rp = require('request-promise-native') async function fetchMovie(item) { const url = `http://api.douban.com/v2/movie/subject/${item.doubanId}` const res = await rp(url) let body try { body = JSON.parse(res) } catch(err) { console.log(err) } return body } ~~~ # 进程通信 子进程代码 ~~~ ; (async () => { let result = await getData() process.send({result}) // 将这个结果发送出去 process.exit(0) // 退出进程 })() ~~~ 父进程 ~~~ const cp = require('child_process') const {resolve} = require('path') ;(async () => { const script = resolve(__dirname, 'child_process.js') const child = cp.fork(script, []) // 返回子进程对象 let invoked = false child.on('error', err => { if (invoked) return invoked = true console.log(err) }) child.on('exit', code => { if (invoked) return invoked = true let err = code === 0 ? null : new Error('exit code' + code) console.log(err) }) // 在子进程使用 process.send() 函数来传递消息时触发 child.on('message', data => { let result = data.result // 处理 result 数据 }) })() ~~~ # 七牛上传 ~~~ // config中的配置 // bucket:存储空间名称 // AK:AccessKey // SK:SecretKey const qiniu = require('qiniu') const nanoid = require('nanoid') const config = require('../config') const bucket = config.qiniu.bucket // 构建BucketManager对象 const mac = new qiniu.auth.digest.Mac(config.qiniu.AK, config.qiniu.SK) const cfg = new qiniu.conf.Config() const client = new qiniu.rs.BucketManager(mac, cfg) // 抓取网络资源到空间 //拿到指定的url,将内容上传到七牛上 const uploadToQiniu = async (url, key) => { return new Promise((resolve, reject) => { client.fetch(url, bucket, key, (err, ret, info) => { if (err) { reject(err) } else { if (info.statusCode === 200) { resolve({ key }) } else { reject(info) } } }) }) } let sources = [] sources.map(async item => { try { let data = await uploadToQiniu(item.uri, item.name) } catch(err) { console.log(err) } }) ~~~ # 装饰器路由 也可参考 https://juejin.im/post/5c8749225188257f3d5d0bfc # 路由 步骤 1. 在 index.js 调用中间件 /server/middleware/router.js 2. 执行 router.js 的 router 方法 1. 将 /server/routes/ 赋值给 apiPath 2. 实例化 /server/lib/decorator 的 Route,将传入的参数app、apiPath赋值给类属性,实例化koa-router 3. 调用 Route 的 init 方法 1. 导入 apiPath(即routes) 目录下的所有 js 文件 1. 执行controller修饰符,在Controller的prototype属性创建唯一属性symbolPrefix,值为将传入的路径参数 2. 执行get post修饰符,修饰Controller的方法,执行router函数 3. 在routerMap添加键值对,如键为{target: movieController,method:'get',path: '/'},值为getMovies函数 2. 遍历 routerMap,获取conf, controller属性 1. 将controllers转化为数组 2. 若路径前缀存在,与配置中的path拼接为routerPath 3. 调用 koa实例的 router\[method\](routerPath, ...controllers) ## index.js 导入 middleware文件夹内MIDDLEWARES数组的文件 ~~~ const R = require('ramda') const MIDDLEWARES = ['router'] const useMiddlewares = (app) => { R.map( R.compose( R.forEachObjIndexed( initWith => initWith(app) ), require, name => resolve(__dirname, `./middleware/${name}`) ) )(MIDDLEWARES) } ;(async() => { await connect() const app = new Koa() await useMiddlewares(app) app.listen(8888) })() ~~~ ## middleware/router.js 以app和routes目录路径为参数,初始化decorator ~~~ const {resolve} = require('path') const {Route} = require('../lib/decorator') export const router = app => { const apiPath = resolve(__dirname, '../routes') const router = new Route(app, apiPath) router.init() } ~~~ ## routes\\movie.js ~~~ const { controller, get } = require('../lib/decorator') const { getAllMovies, getMovieDetail, getRelativeMovies } = require('../service/movie') @controller('/api/v0/movies') export class movieController { @get('/') async getMovies (ctx, next) { const { type, year } = ctx.query const movies = await getAllMovies(type, year) ctx.body = { success: true, data: movies } } @get('/:id') async getMovieDetail (ctx, next) { const id = ctx.params.id const movie = await getMovieDetail(id) const relativeMovies = await getRelativeMovies(movie) ctx.body = { data: { movie, relativeMovies }, success: true } } } ~~~