'use strict' const corsHandler = { origin: function (ctx) { if (ctx.url === '/test') { // 这里可以配置不运行跨域的接口地址 return false; } return '*'; }, exposeHeaders: ['WWW-Authenticate', 'Server-Authorization'], maxAge: 5, credentials: true, allowMethods: ['GET', 'POST', 'DELETE'], allowHeaders: ['Content-Type', 'Authorization', 'Accept'], } module.exports = { corsHandler }
koa-helmet 中间件
koa-helmet 可以帮助你的 app 抵御一些比较常见的安全 web 安全隐患,它其实是将 9 个安全中间件集中到了一起,做了合并,大部分都是对于 http header 的操作,下图为默认开启的功能。
在项目中使用先安装该中间件, npm i koa-helmet --save ,该项目中直接引用默认配置即可,如果有需要,可以看官方文档自己进行配置。
const helmet = require("koa-helmet") // Helmet app.use(helmet())
其他中间件
koa的中间件可以说很多大神给我们做好了轮子,我们直接可以拿来用就行,例如: bodyParser 、 koa-session 、将将中间件转换成koa2可以使用的中间件 koa-convert 、EJS模板使用 koa-ejs ,大家根据自己需要进行引用,由于是基础模板,暂时没有加上过多中间件,减少体积。
lib文件
这个文件夹主要是用来做存放工具类的文件夹,一些全局的工具处理文件可以放到这边来,目前这个项目中只有2个文件, error.js 和 mongoDB.js
error.js 中主要是在中间件中抛出异常,由于前面我们已经加入了异常捕获的中间件,在中间件操作过程中,如果有错误,我们可以直接抛出异常,这个方法就是为了方便我们配置所用的。文件中的方法是 CodedError 方法继承了Error, ForbiddenError 和 InvalidQueryError 是继承了 CodedError ,记得在使用的时候得实例化一下该构造函数。如果小伙伴对ES6的继承还不熟悉,可以先看一下文档再来看该工具类。
'use strict' class CodedError extends Error { constructor (message = '未知错误', code = -1) { super(message) this.code = code } } module.exports = { CodedError, /** * 拒绝访问构造函数 */ ForbiddenError: class ForbiddenError extends CodedError { constructor (message = '拒绝访问') { super(message, 403) } }, /** * 无效的参数构造函数 */ InvalidQueryError: class InvalidQueryError extends CodedError { constructor (message = '无效的参数') { super(message, 400) } } }
mongoDB.js 文件是对mongoDB的链接配置,后续在models中会讲到。
models文件
该项目中是使用 mongoose 对 mongoDB 对数据库进行操作, mongoose 语法简单,需要过多的学习成本。按照官方文档的配置以及api操作,即可对 mongoBD 进行灵活性存储。 mongoose 的配置包括三大部分: connect 、 Models 和 Schema
connect :用于创建数据库连接及监听
Schema :Schema主要用于定义MongoDB中集合Collection里文档document的结构,可以理解为mongoose对表结构的定义(不仅仅可以定义文档的结构和属性,还可以定义文档的实例方法、静态模型方法、复合索引等),每个schema会映射到mongodb中的一个collection,schema不具备操作数据库的能力,简单理解是对字段的定义,操作数据库必须按照这些字段进行,否在会报错。
Models : Model是由Schema编译而成的假想(fancy)构造器,具有抽象属性和行为。Model的每一个实例(instance)就是一个document,document可以保存到数据库和对数据库进行操作。简单说就是model是由schema生成的模型,可以对数据库的操作。
在我们项目中,我们把它全局集合在models文件中进行配置。 index.js 文件里面操作了 connect 、 Models 这两个步骤。先看代码:
const fs = require('fs'); const path = require('path'); const mongoose = require('mongoose'); //引用mongoose模块 const config = require('../config') const { logger } = require('../middlewares/logger') let url = "mongodb://" + config.mongoDB.host + ":" + config.mongoDB.port + "https://www.jb51.net/" + config.mongoDB.database; var mongo = mongoose.createConnection(url); //创建一个数据库连接 let db = { mongoose: mongoose, mongo: mongo, models: {} }; // 错误 mongo.on('error', function (err) { logger.error(new Error(err)); }); // 开启 mongo.once('open', function () { logger.info("mongo is opened"); }); // 整合models文件下的其他js文件 fs.readdirSync(__dirname) .filter(function (file) { return (file.indexOf(".") !== 0) && (file !== "index.js"); }).forEach(function (file) { var modelFile = require(path.join(__dirname, file)); var schema = new mongoose.Schema(modelFile.schema); db.models[modelFile.name] = mongo.model(modelFile.name, schema, modelFile.name); }); // 根据name选择model db.getModel = function (name) { return this.models[name]; }; module.exports = db;