Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

138
Views
¿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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!