代码拉取完成,页面将自动刷新
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser')
const logger = require('morgan');
const cors = require('cors');
const mount = require('mount-routes')
const apiResponse = require('./utils/utils.apiResponse')
// https://www.npmjs.com/package/chalk
const chalk = require('chalk');
const isDev = process.env.NODE_ENV === 'development'
//访问不同的 .env文件
require('dotenv').config({path: isDev ? './.env.development' : './.env.production'})
require('express-async-errors');
// 数据库连接
require('./db/index')
const sessionAuth = require('./middlewares/session')
const app = express();
//session 全局中间件配置
app.use(sessionAuth)
//处理post参数解析
app.use(bodyParser.json())
app.use(bodyParser.urlencoded({extended: false}))
//解决跨域
app.use(cors())
// 设置跨域和相应数据格式
app.all('/v1/*', function (req, res, next) {
res.header('Access-Control-Allow-Origin', '*')
res.header('Access-Control-Allow-Headers', 'X-Requested-With, token')
res.header('Access-Control-Allow-Headers', 'X-Requested-With, Authorization')
res.header('Content-Type', 'application/json;charset=UTF-8')
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization, Accept,X-Requested-With')
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
if (req.method === 'OPTIONS') res.send(200)
/*让options请求快速返回*/
else next()
})
if (isDev) {
console.log(chalk.bold.yellow('当前是开发环境'))
// 在开发环境中 将客户端发送到服务器端的请求信息打印到控制台中
app.use(logger('dev'))
} else {
console.log(chalk.bold.yellow('当前是生产环境'))
}
app.use(express.json());
app.use(express.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
// 使用swagger API 文档 必须在解决跨域设置数据格式之前
// https://www.npmjs.com/package/express-swagger-generator
const expressSwagger = require('express-swagger-generator')(app)
const options = require('./config/swagger.config') //配置信息
expressSwagger(options)
const scheduler = require('./scheduler');
// 监听 SIGINT 信号,当应用程序被强制关闭时停止所有定时任务
process.on('SIGINT', (signal) => {
scheduler.stop();
process.exit();
});
// 带路径的用法并且可以打印出路由表 true 代表展示路由表在打印台
mount(app, path.join(process.cwd(), '/routes'), isDev)
// throw 404 if URL not found
app.all("*", function (req, res) {
return apiResponse.notFoundResponse(res, "404 --- 接口不存在");
});
app.use(function (err, req, res, next) {
if (err.name === "UnauthorizedError") {
return apiResponse.unauthorizedResponse(res, 'token不存在或已过期');
}
//TODO: 必须把错误传递出去 否则这里无法捕获到中间件 throw Error() 的错误
next(err);
});
app.listen(process.env.PORT, () => {
/* 开启定时任务 */
// scheduler.start();
console.log(chalk.hex('#8e44ad').bold(`
.----------------. .----------------. .----------------. .----------------. .----------------. .----------------.
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| | ________ | || | ____ ____ | || | ___ | || | __ | || | ______ | || | _____ | |
| | | __ _| | || | |_ _||_ _| | || | .' _ '. | || | / \\ | || | |_ __ \\ | || | |_ _| | |
| | |_/ / / | || | \\ \\ / / | || | | (_) '___ | || | / /\\ \\ | || | | |__) | | || | | | | |
| | .'.' _ | || | \\ \\/ / | || | .\`___'/ _/ | || | / ____ \\ | || | | ___/ | || | | | | |
| | _/ /__/ | | || | _| |_ | || | | (___) \\_ | || | _/ / \\ \\_ | || | _| |_ | || | _| |_ | |
| | |________| | || | |______| | || | \`._____.\\__| | || ||____| |____|| || | |_____| | || | |_____| | |
| | | || | | || | | || | | || | | || | | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
'----------------' '----------------' '----------------' '----------------' '----------------' '----------------'
`))
console.log(chalk.bold.green(`项目启动成功: ${process.env.URL}:${process.env.PORT}/v1`));
console.log(chalk.bold.green(`接口文档地址: ${process.env.URL}:${process.env.PORT}/swagger`));
});
module.exports = app;
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。