💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
[TOC] # app.js ## 导入文件 ### 配置文件 ~~~ var config = require('./config'); ~~~ ### oneapm ~~~ if (!config.debug && config.oneapm_key) { require('oneapm'); } ~~~ ### 依赖库 ~~~ require('colors'); var path = require('path'); var Loader = require('loader'); var LoaderConnect = require('loader-connect') var express = require('express'); var session = require('express-session'); var passport = require('passport'); var RedisStore = require('connect-redis')(session); var _ = require('lodash'); var csurf = require('csurf'); var compress = require('compression'); var bodyParser = require('body-parser'); var busboy = require('connect-busboy'); var errorhandler = require('errorhandler'); var cors = require('cors'); var helmet = require('helmet'); var bytes = require('bytes') ~~~ ### 数据库 ~~~ // 打印 mongodb 查询日志 require('./middlewares/mongoose_log'); 导入models require('./models'); ~~~ ### github登录 ~~~ var GitHubStrategy = require('passport-github').Strategy; var githubStrategyMiddleware = require('./middlewares/github_strategy'); ~~~ ### 路由 ~~~ var webRouter = require('./web_router'); var apiRouterV1 = require('./api_router_v1'); ~~~ ### models ~~~ var auth = require('./middlewares/auth'); var errorPageMiddleware = require('./middlewares/error_page'); var proxyMiddleware = require('./middlewares/proxy'); var requestLog = require('./middlewares/request_log'); var renderMiddleware = require('./middlewares/render'); ~~~ ### 日志 ~~~ var logger = require('./common/logger'); ~~~ <br> ## 运行前配置 ### 静态文件目录 ~~~ var staticDir = path.join(__dirname, 'public'); ~~~ ### assets ~~~ // assets var assets = {}; if (config.mini_assets) { try { assets = require('./assets.json'); } catch (e) { logger.error('You must execute `make build` before start app when mini_assets is true.'); throw e; } } ~~~ ### hostname ~~~ var urlinfo = require('url').parse(config.host); config.hostname = urlinfo.hostname || config.host; ~~~ <br> ## 运行 ### express ~~~ var app = express(); ~~~ ### 模板 ~~~ // configuration in all env app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'html'); app.engine('html', require('ejs-mate')); app.locals._layoutFile = 'layout.html'; ~~~ ### trust proxy 支持反向代理 当enable以后, 可以支持X-Forwarded-Proto(协议代理) X-Forwarded-For(ip代理), X-Forwarded-Host(主机代理), ~~~ app.enable('trust proxy'); ~~~ ### 输出请求时间、渲染时间 ~~~ // Request logger。请求时间 app.use(requestLog); if (config.debug) { // 渲染时间 app.use(renderMiddleware.render); } ~~~ ### 静态资源 ~~~ // 静态资源 if (config.debug) { app.use(LoaderConnect.less(__dirname)); // 测试环境用,编译 .less on the fly } app.use('/public', express.static(staticDir)); // 当 google 和 github 封锁严重时,则需要通过服务器代理访问它们的静态资源 app.use('/agent', proxyMiddleware.proxy); ~~~ ### 通用中间件 ~~~ app.use(require('response-time')()); app.use(helmet.frameguard('sameorigin')); app.use(bodyParser.json({limit: '1mb'})); app.use(bodyParser.urlencoded({ extended: true, limit: '1mb' })); app.use(require('method-override')()); app.use(require('cookie-parser')(config.session_secret)); app.use(compress()); app.use(session({ secret: config.session_secret, store: new RedisStore({ port: config.redis_port, host: config.redis_host, db: config.redis_db, pass: config.redis_password, }), resave: false, saveUninitialized: false, })); ~~~ ### passport中间件 ~~~ // oauth 中间件 app.use(passport.initialize()); // github oauth passport.serializeUser(function (user, done) { done(null, user); }); passport.deserializeUser(function (user, done) { done(null, user); }); passport.use(new GitHubStrategy(config.GITHUB_OAUTH, githubStrategyMiddleware)); ~~~ ### 自定义中间件 ~~~ // 验证用户是否登录 app.use(auth.authUser); // 验证用户是否被屏蔽 app.use(auth.blockUser()); ~~~ ### csurf添加csrfToken方法、校验token ~~~ if (!config.debug) { app.use(function (req, res, next) { if (req.path === '/api' || req.path.indexOf('/api') === -1) { csurf()(req, res, next); return; } next(); }); app.set('view cache', true); } ~~~ ### 错误页 ~~~ app.use(errorPageMiddleware.errorPage); ~~~ ### csrfToken设置 ~~~ _.extend(app.locals, { config: config, Loader: Loader, assets: assets }) _.extend(app.locals, require('./common/render_helper')); app.use(function (req, res, next) { res.locals.csrf = req.csrfToken ? req.csrfToken() : ''; next(); }); ~~~ ### 上传插件connect-busboy ~~~ app.use(busboy({ limits: { fileSize: bytes(config.file_limit) } })); ~~~ ### 路由 ~~~ app.use('/api/v1', cors(), apiRouterV1); app.use('/', webRouter); ~~~ ### error handler ~~~ if (config.debug) { app.use(errorhandler()); } else { app.use(function (err, req, res, next) { logger.error(err); return res.status(500).send('500 status'); }); } ~~~ ### 端口监听 ~~~ if (!module.parent) { app.listen(config.port, function () { logger.info('NodeClub listening on port', config.port); logger.info('God bless love....'); logger.info('You can debug your app with http://' + config.hostname + ':' + config.port); logger.info(''); }); } ~~~