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 ?
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í:
replacer a su favorPara 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.
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; });