Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

139
Visualizações
¿Es seguro sobrescribir temporalmente un método prototipo en el controlador de ruta express?

Tengo una situación en la que tengo un objeto con muchas instancias de Date . Luego, el objeto se transforma en JSON y se devuelve:

 router.post('/', function () { // Some code that returns the object res.status(200).json(object); });

Necesito cambiar la forma en que todos los objetos Date se convierten a JSON, así que estaba pensando en hacer esto:

 router.post('/', function() { var originalToJSON = Date.prototype.toJSON; Date.prototype.toJSON = function() { return moment(this).format(...); // some formatting function } res.status(200).json(object); Date.prototype.toJSON = originalToJSON; });

Me doy cuenta de que esta es una práctica terrible, pero tengo curiosidad por saber cuáles son las implicaciones. Dado que estoy restaurando Date.prototype.toJSON a su estado original justo después de que el objeto se convierte a JSON, ¿es posible que las solicitudes que llegan mientras se res.status(200).json(object) y sobrescriban ¿ Date.prototype.toJSON ?

about 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

No debería ser un problema que algunas otras partes de su código usen el método JSON modificado porque el código se ejecuta hasta el final y no produce ni espera entre esos dos cambios de métodos JSON , pero existe el riesgo de que su código No use su método modificado: depende realmente de la implementación de res.json() y, si bien puede funcionar ahora, puede dejar de funcionar en el futuro si la implementación interna de Express cambia, y confiar en que no cambie es una fuga. abstracción con riesgo de rotura en el futuro.

Puedes hacer algunas otras cosas aquí:

  1. Puede usar sus propios objetos personalizados para las fechas y convertirlos como desee.
  2. Puede usar su propia función que prepara JSON en lugar de confiar en la función express incorporada
  3. Puede usar el parámetro de reemplazo de replacer a su favor
  4. Puede usar objetos personalizados para todo el objeto para estrigificar, no solo las fechas como en el número 1

Para el número 3, consulte: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify

El parámetro de reemplazo puede ser una función o una matriz. Como función, toma dos parámetros, la clave y el valor se encadenan. El objeto en el que se encontró la clave se proporciona como el parámetro this del sustituto. Inicialmente, se le llama con una clave vacía que representa el objeto que se está encadenando, y luego se le llama para cada propiedad del objeto o matriz que se está encadenando. [...] Si devuelve una cadena, esa cadena se usa como el valor de la propiedad al agregarla a la cadena JSON.

En su caso particular, el sustituto podría simplemente devolver las fechas con el formato que desee y devolver todo lo demás sin cambios. El parámetro de reemplazo de JSON.stringify() se crea específicamente para casos como ese.

about 4 years ago · Santiago Trujillo Relatório

0

En ese caso preciso, todo es sincrónico, por lo que se ejecutará de una sola vez. Como tal, debería ser seguro hacerlo.

Sin embargo, jugar con el prototipo suele ser una mala idea, especialmente cuando hay soluciones mucho más simples para su problema:

 function toJSON(input) { if(typeof input === 'date') { return moment(input).format(); } else if(typeof input === 'object') { let o = {}; Object.keys(input).map((key) => { o[key] = toJSON(input[key]); }); return o; } else { return input; } } router.post('/', function() { var originalToJSON = Date.prototype.toJSON; Date.prototype.toJSON = function() { return moment(this).format(...); // some formatting function } res.status(200).json(toJSON(object)); Date.prototype.toJSON = originalToJSON; });
about 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda