Add Property to Object that is returned by Sequelize FindOne

前端 未结 5 1639
孤独总比滥情好
孤独总比滥情好 2020-12-29 05:09

I am trying to add a property to a sequelize instance before passing it back to the client.

router.get(\'/cats/1\', function (req, res) {
    Cat.findOne({w         


        
相关标签:
5条回答
  • 2020-12-29 05:12

    It won't let me comment on the correct answer above (https://stackoverflow.com/a/38469390/562683), just wanted to add a use case where this helped me.

    I have an existing mysql database that we cannot change the schema of (has to work with the old system and the new system until we can deprecate the old system) but we've layered MonogoDB as well for additional features until we can do a system refactor.

    The answer above of the Virtual property helped because i'd basically make a placeholder for the mongo db information (in this case, an object activity log) and add it on the 'findMyObject' service call.

    For example:

    const model = sequelize.define('myobj', {
      id: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        primaryKey: true,
        field: 'eventId',
      },
      name: { type: Sequelize.STRING, allowNull: false },
      history: Sequelize.VIRTUAL,
      ...
    }
    

    Then in the MyObjectService, findMyObject call:

    ...
    const result = yield MyObject.findOne(query);
    result.history = yield getMyObjectHistoryArray(id);
    return result;
    

    And the resultant JSON looks like:

    {
      "id": 1,
      "name": "My Name",
      "history": [ 
        {...},
        {...},
      ]
    }
    

    So we were able to extend the object without changing the db, but still have an object in the backend where you can go:

    let obj = yield findMyObject(id);
    obj.name = "New Name";
    return yield obj.save();  
    

    Which you wouldn't be able to do if, in the findMyObject function, you either did {raw: true} or result.get({plain: true})

    0 讨论(0)
  • 2020-12-29 05:21

    What works for me is to use setDataValue

    router.get('/cats/1', function (req, res) {
        Cat.findOne({where: {id: 1}})
            .then(function (cat) {
                cat.setDataValue("name", "Lincoln");
                res.json(cat);
            });
    });
    

    Specs for the function

    public setDataValue(key: string, value: any)
    
    Update the underlying data value
    
    Params:
    
    Name    Type    Attribute   Description
    key     string              key to set in instance data store   
    value   any                 new value for given key
    

    Source: https://sequelize.org/master/class/lib/model.js~Model.html#instance-method-setDataValue

    0 讨论(0)
  • 2020-12-29 05:25

    you can use toJSON() to convert Sequelize object into JSON type and then add properties as we do in js

    Example :

        UserModel.findById(req.params.id)
         .then(function (userIns) {
    
            // here userIns is Sequelize Object 
            // and data is Json Object
    
            let data = userIns.toJSON();
            data['displayName'] = 'John';
    
        })
    
    0 讨论(0)
  • 2020-12-29 05:33

    The following works for sequelize v4.

    ...
    const order = Order.findOne(criteria);
    order.setDataValue('additionalProperty', 'some value');
    ...
    

    Hope this helps. It's a bit late but in case people are still looking for answers.

    0 讨论(0)
  • 2020-12-29 05:38

    The Sequelize Model class (of which your cats are instances) has a toJSON() method which res.json will presumably use to serialise your cats. The method returns the result of Model#get() (https://github.com/sequelize/sequelize/blob/95adb78a03c16ebdc1e62e80983d1d6a204eed80/lib/model.js#L3610-L3613), which only uses attributes defined on the model. If you want to be able to set the cats name, but not store names in the DB, you can use a virtual column when defining your cat model:

    sequelize.define('Cat', {
      // [other columns here...]
      name: Sequelize.VIRTUAL
    });
    

    Alternatively, if you don't want to add properties to the model definition:

    cat = cat.toJSON(); // actually returns a plain object, not a JSON string
    cat.name = 'Macavity';
    res.json(cat);
    
    0 讨论(0)
提交回复
热议问题