--- title: Swagger setting tags: Projects --- # Swagger setting ## Installation * [swagger-jsdoc](https://www.npmjs.com/package/swagger-jsdoc) * This library reads your JSDoc-annotated source code and generates an OpenAPI (Swagger) specification * [swagger-ui-express](https://www.npmjs.com/package/swagger-ui-express) * This module allows you to serve auto-generated swagger-ui generated API docs from express `npm i swagger-jsdoc swagger-ui-express` `npm i -D @types/swagger-jsdoc @types/swagger-ui-express` ## Settings * entry file ==index.js== ```typescript= import swaggerUi from 'swagger-ui-express'; import { swaggerSpec } from './config/swagger'; import { logger, morganMiddleware } from './config/winston'; app.use(morganMiddleware); app.use('/swagger', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); ``` * config file ==swagger.ts== ```typescript= import swaggerJSDoc from 'swagger-jsdoc'; import packageJson from '../../package.json'; const options = { swaggerDefinition: { info: { title: packageJson.name, version: packageJson.version, description: packageJson.description || packageJson.name }, basePath: '/api/' }, apis: ['./src/routes/v1/index.ts'] }; export const swaggerSpec = swaggerJSDoc(options); ``` * ==./src/routes/v1/index.ts== * As we have configured settings in that ==swagger.ts== above, so 'swagger-jsdoc' library will take the contents of @openapi (or @swagger) with the above configuration, now we will have to tell the library details of every api ```typescript= import { Router } from 'express'; import checkIp from './checkIp'; import contact from './contact'; import focus from './focus'; import news from './news'; import notice from './notice'; import quotation from './quotation'; import response from './response'; const router = Router(); /** * @swagger * /checkIp: * get: * summary: 偵測 IP 來源地區 * responses: * 200: * description: OK * 400: * description: Client error * 500: * description: Server error */ router.use('/checkIp', checkIp); /** * @swagger * /contact: * post: * summary: 聯繫我們 * parameters: * - name: body * in: body * type: object * properties: * name: * type: string * surname: * type: string * mobile: * type: string * email: * type: string * area: * type: string * type: * type: string * iScustomer: * type: string * login: * type: string * content: * type: string * required: * - name * - surname * - mobile * - email * - area * - type * responses: * 200: * description: OK * 400: * description: Client error * 500: * description: Server error */ router.use('/contact', contact); /** * @swagger * /focus: * get: * summary: 財經新聞 * parameters: * - name: lang * in: query * required: true * type: string * responses: * 200: * description: OK * 400: * description: Client error * 500: * description: Server error */ router.use('/focus', focus); /** * @swagger * /news: * get: * summary: 取得即時新聞 * responses: * 200: * description: OK * 400: * description: Client error * 500: * description: Server error */ router.use('/news', news); /** * @swagger * /notice: * get: * summary: 平台公告 * parameters: * - name: lang * in: query * required: true * type: string * responses: * 200: * description: OK * 400: * description: Client error * 500: * description: Server error */ router.use('/notice', notice); /** * @swagger * /quotation: * get: * summary: 市場分析 * parameters: * - name: lang * in: query * required: true * type: string * responses: * 200: * description: OK * 400: * description: Client error * 500: * description: Server error */ router.use('/quotation', quotation); /** * @swagger * /response: * get: * summary: 企業責任 * parameters: * - name: lang * in: query * required: true * type: string * responses: * 200: * description: OK * 400: * description: Client error * 500: * description: Server error */ router.use('/response', response); export default router; ```