修改默认的favicon
'use strict';
const path = require('path');
const fs = require('fs');
module.exports = appInfo => {
const projectName = 'cai_xiang_qing';
const config = (exports = {});
// 修改导航栏上面的图标 以读取网络图片的方式修改
config.siteFile = {
'/favicon.ico': fs.readFileSync(path.join(__dirname, '../app/public/favicon.png')),
};
// 用于cookie签名密钥,应更改为您自己的并保持安全
config.keys = projectName + '_1614669180311_4617';
// 在此处添加中间件配置
config.middleware = [ 'errorHandler', 'authentication' ];
// 配置 鉴权中间件
config.authentication = {
enable: false, // 控制中间件是否开启。
// allowed: [ // allowed:不需要token验证的路由
// '/api',
// // '/api/v1/user/login',
// ],
// match: [// 设置只有符合某些规则的请求才会经过这个中间件。
// ],
ignore: [// 设置符合某些规则的请求不经过这个中间件。
// '/test',
// '/cms/login',
// '/api',
'/',
],
};
// 配置 异常中间件
config.errorHandler = {
// 只对 /api 前缀的 url 路径生效
match: '/',
};
// 允许跨域 安全机制
config.security = {
// 如果需要针对某一路径忽略某安全选项
// ignore: '/api',
// 关闭 csrf
// csrf: {
// enable: false,
// },
// 跨域白名单 若用户没有配置 domainWhiteList 或者 domainWhiteList数组内为空,
// 则默认会对所有跳转请求放行,即等同于ctx.unsafeRedirect(url) 等同于放开所以重定向 重定向
// csrf
csrf: {
enable: false,
// 如果需要针对某一路径忽略某安全选项
// ignore: [ '/api' ],
// 如果只想开启针对某一路径
// match: '/example',
type: 'ctoken', // 可以是ctoken、referer、all或any,默认为ctoken
useSession: false, // 如果useSession设置为true,则在会话中保留秘密而不是cookie
ignoreJSON: false, // 如果ignoreJSON设置为true,则跳过检查JSON请求
cookieName: 'csrfToken', // csrf token的cookie名称
sessionName: 'csrfToken', // csrf token的会话名
headerName: 'x-csrf-token', // 请求头中csrf令牌的名称
bodyName: '_csrf', // 请求body中csrf令牌的名称
queryName: '_csrf', // request csrf token's name in query
// 跨域白名单 若用户没有配置 domainWhiteList 或者 domainWhiteList数组内为空,
// 则默认会对所有跳转请求放行,即等同于ctx.unsafeRedirect(url) 等同于放开所以重定向 重定向
refererWhiteList: [ 'http://localhost:3000' ],
},
ssrf: {
// ipBlackList: [
// '10.0.0.0/8', // 支持 IP 网段
// '0.0.0.0/32',
// '127.0.0.1', // 支持指定 IP 地址
// ],
// 配置了 checkAddress 时,ipBlackList 不会生效
// checkAddress(ip) {
// return ip !== '127.0.0.1';
// },
},
// 安全白名单,以 . 开头
domainWhiteList: [ '*' ],
};
// 允许跨域的方法
config.cors = {
origin: 'http://localhost:3000',
allowMethods: 'GET, PUT, POST, DELETE, PATCH',
whiteList: [ 'http://localhost:3000' ],
};
// 自定义日志路径
config.logger = {
// 默认编码为 utf-8,可通过如下方式覆盖 以下设置成gbk:
encoding: 'utf-8',
// 设置输出格式为JSON,方便日志监控系统分析
outputJSON: true,
// 定义日志路径
dir: path.join('./logs/', appInfo.name),
// 应用相关日志,供应用开发者使用的日志。我们在绝大数情况下都在使用它。
appLogName: 'app-log.json',
// 框架内核、插件日志
coreLogName: 'core-log.json',
// 进程日志,框架和使用到 agent 进程执行任务的插件会打印一些日志到这里。
agentLogName: 'agent-log.json',
// 实际一般不会直接使用它,任何 logger 的 .error() 调用输出的日志都会重定向到这里,重点通过查看此日志定位异常。
errorLogName: 'error-log.json',
// 打印所有级别日志到文件中 关闭所有打印到文件的日志
level: 'DEBUG',
// level: 'NONE',
// 终端日志级别
consoleLevel: 'DEBUG',
// 日志格式
contextFormatter(meta) {
return [
meta.date,
meta.message,
].join('[]');
},
formatter() {
// 返回 console.log(`[${meta.date}] [${meta.ctx} ${meta.ctx}] ${meta.message}`);
return;
},
};
// 自定义日志
config.customLogger = {
// 支付
payLog: {
level: 'INFO',
file: path.join('./pay.json'),
},
// 定时任务日志
scheduleLogger: {
// 日志级别
level: 'INFO',
// 自定义日志路径
file: path.join('./schedule.json'),
},
// 请求日志
requestLog: {
level: 'INFO',
file: path.join('./requestLog.json'),
},
// 响应日志
responseLog: {
level: 'INFO',
file: path.join('./responseLog.json'),
},
};
// 日志切割 我们也可以按照文件大小进行切割。例如,当文件超过 2G 时进行切割。默认按照天来切割
config.logrotator = {
// filesRotateBySize: [ // 将按大小旋转的文件列表
// path.join(appInfo.root, 'logs', 'web.json'),
// path.join(appInfo.root, 'logs', 'agent.json'),
// path.join(appInfo.root, 'logs', 'web.log.json'),
// path.join(appInfo.root, 'logs', 'schedule.json'),
// // agent.json
// ],
// maxFileSize: 50 * 1024 * 1024, // 判断是否有文件需要旋转的最大文件大小
// // filesRotateByHour: [ // 按小时轮换的文件列表
// // path.join(appInfo.root, 'logs', 'common-error.log'),
// // ],
// hourDelimiter: '-', // 使用指定的分隔符按小时旋转文件
// maxFiles: 10, // 工件按大小旋转
// rotateDuration: 60000000000, // 判断文件是否需要旋转的时间间隔
// maxDays: 0, // 保留max days日志文件,默认值为'31'。设置“0”以保留所有日志
};
// socket io 配置
config.io = {
// init: {}, // 设置引擎, 默认 ws 引擎
namespace: {
'/io': {
// 这里的 auth 以及 filter 是待会会编写的两个中间件,用于不用依据自己的情况选择即可
connectionMiddleware: [ 'auth' ],
// packetMiddleware: ['filter'],
},
},
};
// token 配置
config.jwt = {
secret: 'bcrypt',
expiresIn: 60 * 60 * 2, // 2小时过期
};
// 数据库连接
config.sequelize = {
datasources: [
{
// 挂载到ctx 的名称 ctx.model
delegate: 'model',
// model 文件路径 `app/model/*.js`
baseDir: 'model',
// 数据库类型
dialect: 'mysql',
// 主机地址
host: '127.0.0.1',
// 数据库密码
password: '123456',
// 端口
port: 3306,
// 数据库
database: 'egg-mode',
// 中国时区
timezone: '+08:00',
// 个性化配置
define: {
// 取消数据表名复数
freezeTableName: true,
// 自动写入时间戳 created_at updated_at
timestamps: true,
// 字段生成软删除时间戳 deleted_at
paranoid: true,
// 重新命名
// createdAt: 'created_at',
// updatedAt: 'updated_at',
// deletedAt: 'deleted_at',
// 所有驼峰命名格式化
underscored: true,
},
},
],
};
// 文件上传表名单 覆盖整个白名单,只允许上传 '.png' 格式
config.multipart = {
// 文件大小
fileSize: '5mb',
// 文件后缀白名单
whitelist: [
// images
'.jpg', '.jpeg', // image/jpeg
'.png', // image/png, image/x-png
'.gif', // image/gif
],
};
// 打开前置代理模式
exports.proxy = true;
exports.ipHeaders = 'X-Real-Ip, X-Forwarded-For';
exports.hostHeaders = 'X-Forwarded-Host';
// 配置文件 项目中可以 app.config 来使用
const userConfig = {
// myAppName: 'egg',
};
return {
...config,
...userConfig,
};
};