Какой самый элегантный способ расширить нативный объект в проекте NodeJS?

У меня есть проект 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);
});

Я думаю, вы можете найти хорошее решение здесь (решение файла ./utils)

Lykos94 17.03.2022 16:59

Если вы хотите соблюдать принцип ответственности Сingle, то не ставьте эту вещь во все BigInt. Вместо этого вы даете всем своим моделям метод toJSON; или даже передать пользовательский сериализатор в JSON.stringify в тех местах, где вы его используете (а также пользовательский десериализатор в JSON.parse соответственно, что может быть даже важнее)

Bergi 17.03.2022 17:11

@ Lykos94 Отличная ссылка, думаю, мне это подойдет. Спасибо!

motiondev 17.03.2022 18:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
3
40
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучшей практикой для такого расширения является использование решения для этого вопрос.

Я рефакторил код следующим образом.

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.

Bergi 21.03.2022 11:28

Не могли бы вы показать пример или ссылку?

motiondev 21.03.2022 13:54

Другие вопросы по теме

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

React native, состояние не определено в useSelector после выборки
Как передать setState в другую функцию и использовать его для целевого значения из выбора материала-интерфейса и обработки изменения, ошибка «значение не определено»
Что я должен использовать в качестве ключа для элементов «строки» в реакции?
У меня проблемы с серией и подсчетом процента побед в моей игре на JavaScript
Получение обратного вызова после выполнения запроса в надстройке Gmail в скрипте приложений
Хотите настроить MUI - панель инструментов с данными и позиционирование вверху страницы
Как отсортировать массив на основе другого массива в JS
Как запрашивать у пользователя ввод данных после каждого раунда в игре «Камень-ножницы-бумага»?
Как получить Word перед сопоставлением слов с помощью regex Javascript?
Значение текстовой записи для сохранения в локальном хранилище браузера