У меня есть проект NodeJS, который использует BigInt для идентификаторов своей модели. У меня также есть WebSocket, где я отправлял клиенту сериализованные объекты. Проблема с BigInt заключается в том, что его нельзя сериализовать, как другие объекты (логические, числовые и т. д.). Поэтому я использую Рекомендация MDN для определения глобальной функции обработчика объекта BigInt.
BigInt.prototype.toJSON = function() { return this.toString() }
С этого момента я буду использовать это во всей области приложения.
Вопрос в том, где разместить этот код, чтобы он был элегантным и соответствовал принципам SOLID?
Я ищу хорошее решение для своего рода проблемы.
В настоящее время он размещен в index.js следующим образом:
import 'dotenv/config';
import cors from 'cors';
import express from 'express';
import logger from './middleware/logger';
const main = async () => {
// where should I modularise BigInt extension
BigInt.prototype.toJSON = function () {
return this.toString();
};
app.use(cors());
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => console.info(`Example app listening on port 3000!`));
};
main().catch((err) => {
logger.error(err);
});
Если вы хотите соблюдать принцип ответственности Сingle, то не ставьте эту вещь во все BigInt
. Вместо этого вы даете всем своим моделям метод toJSON
; или даже передать пользовательский сериализатор в JSON.stringify
в тех местах, где вы его используете (а также пользовательский десериализатор в JSON.parse
соответственно, что может быть даже важнее)
@ Lykos94 Отличная ссылка, думаю, мне это подойдет. Спасибо!
Лучшей практикой для такого расширения является использование решения для этого вопрос.
Я рефакторил код следующим образом.
utils.ts
(BigInt.prototype as any).toJSON = function () {
return this.toString();
};
index.ts
import 'dotenv/config';
import cors from 'cors';
import express from 'express';
import logger from './middleware/logger';
import "utils.ts" // <== this code gets executed, therefore BigInt extenstion is in the scope of project from now on
const main = async () => {
app.use(cors());
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.listen(3000, () => console.info(`Example app listening on port 3000!`));
};
main().catch((err) => {
logger.error(err);
});
Не используйте (BigInt.prototype as any)
. Вместо этого объявите метод toJSON
в интерфейсе BigInt
.
Не могли бы вы показать пример или ссылку?
Я думаю, вы можете найти хорошее решение здесь (решение файла ./utils)