Tengo una aplicación que estoy creando que permite a los usuarios ingresar registros en una página web. Quiero mostrar la fecha/hora de cuando se envió cada registro, probé varios métodos diferentes y finalmente tengo la fecha/hora para mostrar en el formato que quiero, pero parece que la marca de tiempo se registra cuando el servidor se inicia en lugar de cuando se agrega el registro. Estoy usando moment.js para formatear
Aquí está mi esquema
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const moment = require("moment"); var d = new Date(); var formattedDate = moment(d).format("MM-DD-YYYY, h:mm:ss a"); let codeSchema = new Schema({ code: { type: String }, createdAt: { type: String, default: formattedDate }, }, { collection: "codes" } ); module.exports = mongoose.model("Code", codeSchema);Así es como se ven los registros, excepto que la fecha y la hora es cuando inicio el servidor en lugar de cuando se agregó realmente el documento
123456789789 12-09-2021, 12:59:33 pmproblema interesante Estoy usando mangosta en una aplicación y no he visto este problema. Ver esquema a continuación:
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const schema = new Schema({ createdBy: Object, created: { type: Date, default: Date.now }, matchName: { type: String, required: true }, matchType: { type: String, required: true }, matchActive: { type: Boolean, default: false }, matchPrivate: { type: Boolean, default: true }, matchTime: { type: String, required: true }, matchDate: { type: String, requried: true }, matchPassword: String, matchMembers: [], course: Object, subCourse: Object, par: { type: Number, required: true }, numberOfHoles: { type: Number, required: true }, frontBackNine: { type: String, required: true, default: null }, completed: { type: Boolean, default: false }, compeletedOn: { type: Date }, winner: { type: String }, startingHole: { type: Number, default: 1 }, scorecardSettings: { type: String, required: true }, tournamentGroups: { type: Array, default: [] }, }); module.exports = mongoose.model("Matches", schema);Sin embargo, no estoy usando moment.js.
Dos pensamientos aquí:
Date.nowen lugar de la fecha con formato de momento. Esto es solo para ver si el momento está causando el problema o no y no le dará una solución real.
Piensa en cuándo se evalúa y asigna esa variable; es cuando se crea el esquema, eso sucede solo una vez. En cualquier caso, debe asignar ese valor en el momento en que guarde el registro, asigne el valor como cualquier otro.
Pero Moongose ya tiene una opción para asignar marcas de tiempo a los registros cuando se crean y actualizan. Véalo aquí: https://mongoosejs.com/docs/guide.html#timestamps
Tu código debería verse así:
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const codeSchema = new Schema({ code: { type: String }, createdAt: { type: String, default: formattedDate }, }, { collection: "codes", timestamps: true } ); module.exports = mongoose.model("Code", codeSchema);Sobre el formato, destaco que recomiendo cuidarlo después en el punto final cuando use los datos.
Está asignando un valor predefinido, es por eso que no funciona, debe crear una función y asignar la función como un valor predeterminado para obtener el valor cuando el documento.
const mongoose = require("mongoose"); const Schema = mongoose.Schema; const moment = require("moment"); var createdAt = function(){ var d = new Date(); var formattedDate = moment(d).format("MM-DD-YYYY, h:mm:ss a"); return formattedDate; }; let codeSchema = new Schema({ code: { type: String }, createdAt: { type: String, default: createdAt }, }, { collection: "codes" } ); module.exports = mongoose.model("Code", codeSchema);