2016-05-21 14 views
7

Ho creato uno schema di database Mongoose per un'entità Utente e desidero aggiungere la data corrente in un campo updated_at. Sto tentando di utilizzare la richiamata .pre('save', function() {}) ma ogni volta che la eseguo viene visualizzato un messaggio di errore che mi informa che this non è definito. Ho anche deciso di usare ES6, che credo possa essere una ragione per questo (tutto funziona però). Il mio Mongoose/code nodo ES6 è qui sotto:'questo' non è definito in un gancio di pre-salvataggio Mongoose

import mongoose from 'mongoose' 

mongoose.connect("mongodb://localhost:27017/database", (err, res) => { 
    if (err) { 
    console.log("ERROR: " + err) 
    } else { 
    console.log("Connected to Mongo successfuly") 
    } 
}) 

const userSchema = new mongoose.Schema({ 
    "email": { type: String, required: true, unique: true, trim: true }, 
    "username": { type: String, required: true, unique: true }, 
    "name": { 
    "first": String, 
    "last": String 
    }, 
    "password": { type: String, required: true }, 
    "created_at": { type: Date, default: Date.now }, 
    "updated_at": Date 
}) 

userSchema.pre("save", (next) => { 
    const currentDate = new Date 
    this.updated_at = currentDate.now 
    next() 
}) 

const user = mongoose.model("users", userSchema) 
export default user 

Il messaggio di errore è:

undefined.updated_at = currentDate.now; 
        ^
TypeError: Cannot set property 'updated_at' of undefined 

EDIT: Risolto questo utilizzando @ risposta di vbranden e cambiare da una funzione lessicale a una funzione standard. Tuttavia, ho avuto un problema in cui, mentre non mostrava più l'errore, non stava aggiornando il campo updated_at nell'oggetto. Ho risolto questo problema modificando this.updated_at = currentDate.now a this.updated_at = currentDate.

+0

Correlati: [funzione Freccia vs dichiarazione di funzione/espressioni: Sono equivalente/intercambiabile? ] (http://stackoverflow.com/q/34361379/218196) –

risposta

28

il problema è la funzione freccia utilizza lessicale questo https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions

cambiamento

userSchema.pre("save", (next) => { 
    const currentDate = new Date 
    this.updated_at = currentDate.now 
    next() 
}) 

a

userSchema.pre("save", function (next) { 
    const currentDate = new Date 
    this.updated_at = currentDate.now 
    next() 
}) 
+0

grazie! questo non dà più l'errore, ma in realtà non aggiunge il campo 'updated_at' all'oggetto JSON che emetto attraverso il router durante la creazione di un nuovo utente (nel file di rotte). Se faccio 'console.log (this.updated_at)' restituisce solo 'indefinito'. Sai perché potrebbe essere? –

+0

Prova nuova data() invece di nuova data – vbranden

+0

Thnx molto !! questo mi ha appena salvato un po 'di tempo – Deadfish

Problemi correlati