修改默认的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, };};