170 похожих чатов

Народ, а над DTO (который data transfer object) вообще кто-нибудь

заморачивается? при чём в контексте чистого js, не ts.

я вот хочу данные между сервисами гонять в виде какой-то готовой провалидированной структуры. понаписал тут вот такое:

import assert from 'assert';

export default class BaseDTO {
static schema;

static validateByScheme(data, schema) {
// validate by `ajv`
// `throw new ValidationError()` if data is invalid
}

constructor(data) {
const { schema, validateByScheme } = this.constructor;

assert(schema, 'Schema is not defined');

validateByScheme(data, schema);

Object.assign(this, data);
}

toJSON() {
return { ...this };
}
}

ну и от BaseDTO можно отнаследоваться, например вот так:

class UserDTO extends BaseDTO {
static schema = {
type: 'object',
properties: {
firstName: { type: 'string' },
lastName: { type: 'string' },
},
};

get fullName() {
return `${this.firstName} ${this.lastName}`;
}

toJSON() {
const { fullName } = this;

return {
...super.toJSON(),
fullName,
};
}
}

т.е. в унаследованном классе прописываем схему, можно даже свою реализацию validateByScheme (например, для валидации Joi-ем, а не ajv), можно какие-то геттеры добавить и, если надо, эти геттеры подставить в результат toJSON'а.

Работает как-то так:

const user = new UserDTO({
firstName: 'Pampampam',
lastName: 'Pumpumpum',
});

console.log('user', JSON.stringify(user, null, 2));

/*
user {
"firstName": "Pampampam",
"lastName": "Pumpumpum",
"fullName": "Pampampam Pumpumpum"
}
*/

В принципе, на первый взгляд выглядит более-менее.

Плюсы вижу такие:
1. такие dto можно инстанцировать прямо в контроллерах, что-то типа
new FiltersDTO(req.query)
или
new SearchFormDTO(req.body)
и, если данные неправильные, то ошибка отловится в мидлваре и клиенту уйдёт ответ с ошибками валидации и соответствующим http-кодом. А если данные по схеме прошли, то спокойно этот объект отдавать дальше во внутренние сервисы, в которых единственная необходимая проверка - это что-то типа такого:

class UsersService {
/**
* @param {UserDTO} user
*/
constructor(user) {
assert(user instanceof UserDTO);

this.user = user;
}

// someMethod() {}
}

2. из этих схем когда-нибудь потом можно будет прикрутить генерацию документации к api.

Минусов на первый взгляд не вижу. Но поэтому вам сюда и пишу) Может есть какие-то подводные камни, которые прямо сейчас лично мне неочевидны?
Такой подход вообще норм?

2 ответов

16 просмотров

Схема должна быть отдельно от dto. В dto только поля с данными

как же все сложно

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта