/
githubmirror
/
json-server
Обзор
Документация
Войти
/
githubmirror
/
json-server
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v1.0.0-beta.2
src/app.ts
128 строк
3 KB
xw
fix: The query parameter is incorrect. #1551 (#1552)
03 июн 2024, 14:22
Не верифицирован
03 июн 2024, 14:22
1b7c0fb
Код
Авторство
О чём код?
import { dirname, isAbsolute, join } from 'node:path' import { fileURLToPath } from 'node:url' import { App } from '@tinyhttp/app' import { cors } from '@tinyhttp/cors' import { Eta } from 'eta' import { Low } from 'lowdb' import { json } from 'milliparsec' import sirv from 'sirv' import { Data, isItem, Service } from './service.js' const __dirname = dirname(fileURLToPath(import.meta.url)) const isProduction = process.env['NODE_ENV'] === 'production' export type AppOptions = { logger?: boolean static?: string[] } const eta = new Eta({ views: join(__dirname, '../views'), cache: isProduction, }) export function createApp(db: Low<Data>, options: AppOptions = {}) { // Create service const service = new Service(db) // Create app const app = new App() // Static files app.use(sirv('public', { dev: !isProduction })) options.static ?.map((path) => (isAbsolute(path) ? path : join(process.cwd(), path))) .forEach((dir) => app.use(sirv(dir, { dev: !isProduction }))) // CORS app.use(cors()).options('*', cors()) // Body parser app.use(json()) app.get('/', (_req, res) => res.send(eta.render('index.html', { data: db.data })), ) app.get('/:name', (req, res, next) => { const { name = '' } = req.params const query = Object.fromEntries(Object.entries(req.query) .map(([key, value]) => { if (['_start', '_end', '_limit', '_page', '_per_page'].includes(key) && typeof value === 'string') { return [key, parseInt(value)] } else { return [key, value] } }) .filter(([_, value]) => !Number.isNaN(value)) ) res.locals['data'] = service.find(name, query) next() }) app.get('/:name/:id', (req, res, next) => { const { name = '', id = '' } = req.params res.locals['data'] = service.findById(name, id, req.query) next() }) app.post('/:name', async (req, res, next) => { const { name = '' } = req.params if (isItem(req.body)) { res.locals['data'] = await service.create(name, req.body) } next() }) app.put('/:name', async (req, res, next) => { const { name = '' } = req.params if (isItem(req.body)) { res.locals['data'] = await service.update(name, req.body) } next() }) app.put('/:name/:id', async (req, res, next) => { const { name = '', id = '' } = req.params if (isItem(req.body)) { res.locals['data'] = await service.updateById(name, id, req.body) } next() }) app.patch('/:name', async (req, res, next) => { const { name = '' } = req.params if (isItem(req.body)) { res.locals['data'] = await service.patch(name, req.body) } next() }) app.patch('/:name/:id', async (req, res, next) => { const { name = '', id = '' } = req.params if (isItem(req.body)) { res.locals['data'] = await service.patchById(name, id, req.body) } next() }) app.delete('/:name/:id', async (req, res, next) => { const { name = '', id = '' } = req.params res.locals['data'] = await service.destroyById(name, id, req.query['_dependent']) next() }) app.use('/:name', (req, res) => { const { data } = res.locals if (data === undefined) { res.sendStatus(404) } else { if (req.method === 'POST') res.status(201) res.json(data) } }) return app }