2 votes

Comment ajouter une propriété personnalisée à un modèle dans jugglingdb et la faire renvoyer par JSON ?

Comment ajouter une propriété personnalisée à un jonglagedb modèle ? Je veux définir une propriété personnalisée spécifiquement par rapport à une méthode personnalisée parce que je veux la renvoyer au client.

Voici un exemple utilisant le modèle omniprésent des postes :

db/schema.js :

var Post = schema.define('Post', {
    title:     { type: String, length: 255 },
    content:   { type: Schema.Text },
    date:      { type: Date,    default: function () { return new Date;} },
    timestamp: { type: Number,  default: Date.now },
    published: { type: Boolean, default: false, index: true }
});

app/models/post.js :

var moment = require('moment');

module.exports = function (compound, Post) {
    // I'd like to populate the property in here.
    Post.prototype.time = '';

    Post.prototype.afterInitialize = function () {
        // Something like this:
        this.time = moment(this.date).format('hh:mm A');
    };
}

Je voudrais le renvoyer comme ceci dans app/controllers/posts_controller.js :

action(function index() {
    Post.all(function (err, posts) {
        // Error handling omitted for succinctness.
        respondTo(function (format) {
            format.json(function () {
                send({ code: 200, data: posts });
            });
        });
    });
});

Résultats escomptés :

{
  code: 200,
  data: [
    { 
      title: '10 things you should not do in jugglingdb',
      content: 'Number 1: Try to create a custom property...',
      date: '2013-08-13T07:55:45.000Z',
      time: '07:55 AM',
      [...] // Omitted data
  }, 
  [...] // Omitted additional records
}

Ce que j'ai essayé dans app/models/post.js :

Tentative 1 :

Post.prototype.afterInitialize = function () {
    Object.defineProperty(this, 'time', {
        __proto__: null,
        writable: false,
        enumerable: true,
        configurable: true,
        value: moment(this.date).format('hh:mm A')
    });

    this.__data.time    = this.time;
    this.__dataWas.time = this.time;
    this._time          = this.time;
};

Cela renverrait post.time dans la console via compound c mais pas sur post.toJSON() .

Tentative 2 :

Post.prototype.afterInitialize = function () {
    Post.defineProperty('time', { type: 'String' });
    this.__data.time  = moment(this.date).format('hh:mm A');
};

Cette tentative était prometteuse... elle a fourni le résultat attendu via .toJSON() . Cependant, comme je le craignais, il a également essayé de mettre à jour la base de données avec ce champ.

1voto

matth Points 5707

Il y a actuellement un petit problème de portée qui empêchera l'impression de la valeur (elle affichera seulement time: seulement), mais j'ai fait une demande de modification pour cela. aquí .

Sinon, l'omission de la partie prototype sur afterInitialize a réussi :

Post.afterInitialize = function () {
    this.time = moment(this.date).format('hh:mm A'); // Works with toJSON()
    this.__data.time = this.time;                    // Displays the value using console c
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X