Введение
У моей компании мы использовали JSON-Server С начала начала простых. Теперь мы достигли точки, где настройка просто недостаточно без написания полноценного сервера узла с Express. Поэтому мне посоветовали взглянуть на Mock Service Worker (MSW) И я могу сказать, что теперь у меня есть все, что мне нужно издеваться над всеми нашими API.
JSON-Server
Уровень: Я слишком молод, чтобы умереть
Мы начали с горсткой API, которые были довольно простыми, это было очень легко справиться с JSON-Server Я создал db.json Файл с API я хотел издеваться:
{
"auth": {
"user_id": 60
},
"campaigns": [
{
"id": 1,
"created_at": "2020-05-12T09:45:56.681+02:00",
"name": "Khadijah Clayton"
},
{
"id": 2,
"created_at": "2020-05-12T09:45:56.681+02:00",
"name": "Caroline Mayer"
},
{
"id": 3,
"created_at": "2020-05-12T09:45:56.681+02:00",
"name": "Vanessa Way"
},
{
"id": 4,
"created_at": "2020-05-12T09:45:56.681+02:00",
"name": "Generation X"
},
{
"id": 5,
"created_at": "2020-05-12T09:45:56.681+02:00",
"name": "Mariam Todd (Mitzi)"
}
]
}
А json-server.json Файл со следующим конфигом:
{
"host": "localhost",
"port": 4000,
"delay": 250
}
И А package.json Сценарий:
"api": "json-server demo/db.json",
Беги это с Пряжа бежит API и ударить localhost: 4000/кампании вернет список кампаний, пока так хорошо.
Уровень: Эй, не слишком грубо
Некоторые API будут вложены под Campaign_id PARAL I.E. /Кампании/: Campaign_ID/Задачи Отказ Так что представляем маршруты :
json-server.json :
{
"routes": "demo/routes.json",
"host": "localhost",
"port": 4000,
"delay": 250
}
Маршруты.json :
{
"/campaigns/:campaign_id/tasks": "/campaigns_tasks"
}
Таким образом, любой удар Localhost: 4000/Кампании/321/Задачи будет путь к /campaigns_tasks. В моем файле базы данных.
Уровень: больно мне много
Как вы можете себе представить, что файл базы данных вырос неразумно, очень быстро. Так что представляем средние годы :
json-server.json :
{
"routes": "demo/routes.json",
"middlewares": "demo/middleware.js",
"host": "localhost",
"port": 4000,
"delay": 250
}
Middleware.js :
import campaigns from './demo/campaigns.json';
module.exports = function (req, res, next) {
if (req.method === 'DELETE' || req.method === 'PUT') {
return res.jsonp();
}
if (req.originalUrl === '/campaigns') {
return res.jsonp(campaigns);
}
next();
}
Это позволило мне отделить данные на несколько кусков JSON и позволил мне обработать другие методы, такие как УДАЛИТЬ или Поставить без действий, редактирующих базу данных.
Уровень: ультрасильное насилие
Однако приложение продолжало расти, и так ли сумма Backenc API доставит, что я хотел, чтобы я хотел издеваться. Поэтому я обновил промежуточное программное обеспечение для обработки URL-адресов с помощью Regex, чтобы точно настроить ответ.
Middleware.js :
import campaign from './demo/campaign.json';
import tasks from './demo/tasks.json';
module.exports = function (req, res, next) {
if (req.method === 'DELETE' || req.method === 'PUT') {
return res.jsonp();
}
if (req.originalUrl.match(/\/campaigns\/[0-9]*$/)) {
return res.jsonp(campaign);
}
if (req.originalUrl.match(/\/campaigns\/([0-9]+)\/tasks/)) {
return res.jsonp(tasks);
}
next();
}
Уровень: Кошмар!
Поскольку промежуточное программное ПО выросло больше, так что каждый отдельный файл JSON, длинные массивы сотен предметов были очень трудно поддерживать. Поэтому для того, чтобы данные коротко и динамики, я добавил Faker.js Отказ
Middleware.js :
import campaign from './demo/campaign.js';
module.exports = function (req, res, next) {
if (req.originalUrl.match(/\/campaigns\/[0-9]*$/)) {
const data = campaign();
return res.jsonp(data);
}
next();
}
Campaigns.js :
import faker from 'faker';
const gen = (fn) => {
const count = faker.random.number({ min: 1, max: 10 });
return new Array(count).fill(0).map((_, idx) => fn(idx));
};
module.exports = () => {
faker.seed(32);
return gen(() => ({
id: faker.random.number(),
owner_id: faker.random.number(),
active: faker.random.boolean(),
budget: faker.random.number(),
description: faker.lorem.sentence(),
created_at: new Date(faker.date.recent()).toISOString()
}));
};
Взаимодействовать
Так как вы можете видеть, мы достигли точки, где это было сложнее и сложнее поддерживать. Итак, на данный момент мне было предложено попробовать Mock Service Worker (MSW) Отказ
Местный
Я собираюсь пропустить настройку часть, так как там много статей 1, 2, 3, 4, чтобы связать несколько плюс, конечно, их собственная документация, которая является 👌🏻.
Конфигурация
Я хочу упомянуть, подумал, что у меня установлена как типы браузера, так и узла, потому что я хочу, чтобы браузер обрабатывающую API через сервисный работник, и я также хочу, чтобы спецификация читала отсюда через узел.
server.js.
import { setupServer } from 'msw/node';
import { handlers } from './handlers';
// This configures a request mocking server with the given request handlers.
export const server = setupServer(...handlers);
браузер.js.
import { setupWorker } from 'msw';
import { handlers } from './handlers';
// This configures a Service Worker with the given request handlers.
export const worker = setupWorker(...handlers);
Handlers.js.
export const handlers = [ ... ]
Я также должен был настроить CRA запустить Browser.js на старте и jest запустить Server.js для всех тестов.
Удаление избыточности
Теперь нет необходимости использовать регулярные выражения, поскольку внутри обработчиков я могу настроить Отдых API логика. Итак, удаление MILDWARE.js и Marross.json.
Handlers.js.
import { rest } from 'msw';
import campaigns from './demo/campaigns.js';
import campaign from './demo/campaign.js';
export const handlers = [
rest.get('/campaigns', (_, res, ctx) => {
return res(
ctx.json(campaigns())
);
},
rest.get('/campaigns/:id', (req, res, ctx) => {
const { id } = req.params;
return res(
ctx.json(campaign(id))
);
},
rest.get('/campaigns/:id/*', (req, res, ctx) => {
return res(
ctx.status(200)
);
},
]
Вы можете быстро увидеть, что это может быть разделено на несколько разделов, таких как Кампания Хаус и другие, которые бы легче читать.
import campaignHelpers from './handlers/campaigns'; export const handlers = [ ...campaignHelpers, ...others, ]
Следующие шаги Mswjs/data
Следующие шаги, на которых я хочу работать, когда у меня есть время, устанавливает фабрики данных, чтобы я мог создавать предметы по требованию и иметь более чистое структуру с моделями.
Последние мысли
Да, эта статья выглядит больше похожей на JSON-Server тут, но я думал, что это может быть полезно показать борьбу, которую я прошел и что заставил меня искать еще одно большее решение.
И вот что. Пожалуйста, дайте мне знать, если у вас была похожая борьба, и если эта статья была полезна для вас.
Оригинал: “https://dev.to/alextrastero/why-i-migrated-to-msw-from-json-server-2ihl”