Converting Sequelize Entity Instances to Plain Objects: Methods and Practices

Nov 24, 2025 · Programming · 7 views · 7.8

Keywords: Sequelize | Object Conversion | get Method | Entity Instance | Plain Object

Abstract: This article provides an in-depth exploration of core methods for converting Sequelize ORM entity instances to plain JavaScript objects. Based on high-scoring Stack Overflow answers, it analyzes the principles and advantages of using the get({plain: true}) method, comparing it with alternatives like raw query options and values properties. Through comprehensive code examples and performance analysis, it helps developers understand appropriate scenarios for different conversion approaches and solve technical challenges when adding custom properties in real-world development.

Problem Background and Core Challenges

When using Sequelize.js for database operations, many developers encounter a common issue: entity instances returned from database queries cannot directly accept new properties. This problem stems from the special internal structure of Sequelize instances, which includes multiple layers such as data values, configuration options, and association information.

From the problem description, we can see that developers attempt to use the JSON.parse(JSON.stringify(node)) "hack" to bypass limitations. While this achieves functionality, it presents significant performance issues and potential type conversion risks.

Sequelize Instance Structure Analysis

The console output clearly shows the complete structure of a Sequelize instance:

{
  dataValues: {
    nodeid: 'NodeId',
    name: 'NameHere',
    // ... other fields
  },
  __options: {
    // configuration options
  },
  selectedValues: {
    // selected values
  },
  // ... other internal properties
}

This complex internal structure makes directly adding properties to instances difficult, as Sequelize needs to maintain instance integrity and consistency.

Recommended Solution: The get({plain: true}) Method

According to best practices and Sequelize official documentation, the most recommended conversion method is using get({plain: true}):

db.Sensors.findAll({
    where: {
        nodeid: node.nodeid
    }
}).then(function(sensors) {
    var nodedata = node.get({ plain: true });
    nodedata.sensors = sensors.map(function(sensor) { 
        return sensor.get({ plain: true });
    });
    nodesensors.push(nodedata);
    response.json(nodesensors);
});

This method offers the following advantages:

Alternative Approaches Comparative Analysis

Raw Query Option

Specifying raw: true directly in queries returns raw data objects:

db.Sensors.findAll({
    where: {
        nodeid: node.nodeid
    },
    raw: true
}).then(function(sensors) {
    // sensors are already plain objects
    var nodedata = node.get({ plain: true });
    nodedata.sensors = sensors;
    nodesensors.push(nodedata);
    response.json(nodesensors);
});

This approach is suitable for simple query scenarios but may require the nest: true option when dealing with association queries.

Values Property (Deprecated)

In Sequelize 2.x versions, the values property could be used:

var nodedata = node.values;
nodedata.sensors = sensors.map(function(sensor) { 
    return sensor.values;
});

Note that starting from Sequelize 3.0.0, the values property has been marked as deprecated, with migration to get({plain: true}) recommended.

toJSON() Method

Another viable approach is using toJSON():

var nodedata = node.toJSON();
nodedata.sensors = sensors.map(function(sensor) { 
    return sensor.toJSON();
});

This method is functionally similar to get({plain: true}), but the get() method offers greater flexibility.

Performance and Best Practices

Benchmark testing comparing performance of different methods:

In practical development, follow these best practices:

  1. Prioritize get({plain: true}) for object conversion
  2. Consider raw: true option for simple query scenarios
  3. Avoid JSON serialization-deserialization hack methods
  4. Use appropriate include strategies for associated data

Associated Data Handling

When dealing with associated data, use the include option for eager loading:

db.Nodes.findAll({
    where: {
        farmid: 5
    },
    include: [{
        model: db.Sensors,
        where: {
            nodeid: Sequelize.col('Nodes.nodeid')
        }
    }],
    raw: true,
    nest: true
}).then(function(results) {
    // results already include associated sensor data
    response.json(results);
});

This approach reduces database query counts and improves application performance.

Version Compatibility Considerations

Different Sequelize versions exhibit variations in object conversion:

When upgrading Sequelize versions, corresponding updates to object conversion code are necessary.

Conclusion

Sequelize provides multiple methods for converting entity instances to plain JavaScript objects, with get({plain: true}) being the most recommended standard practice. This method not only offers superior performance but also provides good type safety and version compatibility. By understanding the internal structure of Sequelize instances and the principles of various conversion methods, developers can more effectively handle data conversion requirements and build more robust applications.

In actual projects, it's advisable to select the most appropriate conversion strategy based on specific scenarios, while staying updated with Sequelize official documentation to ensure long-term code maintainability.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.