【问题标题】:force Sequelize retrun result in camelCaseforce Sequelize 以 camelCase 形式返回结果
【发布时间】:2021-01-08 08:35:31
【问题描述】:

我在 node js express 项目中使用 Sequelize,我希望为要在 camelCase 中返回的 sequelize 对象生成每个属性。因为数据库 Developer 使用 PascalCase 前端开发者使用camelCase

所以我需要想出一种机制来将每个属性名称从 PascalCase 转换为 camelCase,有什么想法吗?

【问题讨论】:

    标签: javascript node.js sequelize.js naming-conventions


    【解决方案1】:

    您可以通过field 属性指定自定义列名。见Initialize a model

    attributes.column.field: 如果设置,sequelize 会将属性名称映射到数据库中的不同名称

    例如

    import { sequelize } from '../../db';
    import { DataTypes, Model } from 'sequelize';
    import faker from 'faker';
    
    class User extends Model {}
    User.init(
      {
        userId: {
          primaryKey: true,
          autoIncrement: true,
          allowNull: false,
          type: DataTypes.INTEGER,
          field: 'UserId',
        },
        userEmail: {
          type: DataTypes.STRING,
          field: 'UserEmail',
        },
        userAvatar: {
          type: DataTypes.STRING,
          field: 'UserAvatar',
        },
      },
      { sequelize },
    );
    
    (async function test() {
      try {
        await sequelize.sync({ force: true });
        // seed
        await User.bulkCreate([
          { userEmail: faker.internet.email(), userAvatar: faker.internet.avatar() },
          { userEmail: faker.internet.email(), userAvatar: faker.internet.avatar() },
          { userEmail: faker.internet.email(), userAvatar: faker.internet.avatar() },
        ]);
        const users = await User.findAll();
        const userDataValues = users.map((u) => u.dataValues);
        console.log(userDataValues);
      } catch (error) {
        console.log(error);
      } finally {
        await sequelize.close();
      }
    })();
    

    执行上述代码的日志:

    Executing (default): DROP TABLE IF EXISTS "User" CASCADE;
    Executing (default): DROP TABLE IF EXISTS "User" CASCADE;
    Executing (default): CREATE TABLE IF NOT EXISTS "User" ("UserId"   SERIAL , "UserEmail" VARCHAR(255), "UserAvatar" VARCHAR(255), PRIMARY KEY ("UserId"));
    Executing (default): SELECT i.relname AS name, ix.indisprimary AS primary, ix.indisunique AS unique, ix.indkey AS indkey, array_agg(a.attnum) as column_indexes, array_agg(a.attname) AS column_names, pg_get_indexdef(ix.indexrelid) AS definition FROM pg_class t, pg_class i, pg_index ix, pg_attribute a WHERE t.oid = ix.indrelid AND i.oid = ix.indexrelid AND a.attrelid = t.oid AND t.relkind = 'r' and t.relname = 'User' GROUP BY i.relname, ix.indexrelid, ix.indisprimary, ix.indisunique, ix.indkey ORDER BY i.relname;
    Executing (default): INSERT INTO "User" ("UserId","UserEmail","UserAvatar") VALUES (DEFAULT,'Korey31@hotmail.com','https://s3.amazonaws.com/uifaces/faces/twitter/markretzloff/128.jpg'),(DEFAULT,'Tevin_Wintheiser81@yahoo.com','https://s3.amazonaws.com/uifaces/faces/twitter/faisalabid/128.jpg'),(DEFAULT,'Cody47@yahoo.com','https://s3.amazonaws.com/uifaces/faces/twitter/sur4dye/128.jpg') RETURNING *;
    Executing (default): SELECT "UserId" AS "userId", "UserEmail" AS "userEmail", "UserAvatar" AS "userAvatar" FROM "User" AS "User";
    [ { userId: 1,
        userEmail: 'Korey31@hotmail.com',
        userAvatar:
         'https://s3.amazonaws.com/uifaces/faces/twitter/markretzloff/128.jpg' },
      { userId: 2,
        userEmail: 'Tevin_Wintheiser81@yahoo.com',
        userAvatar:
         'https://s3.amazonaws.com/uifaces/faces/twitter/faisalabid/128.jpg' },
      { userId: 3,
        userEmail: 'Cody47@yahoo.com',
        userAvatar:
         'https://s3.amazonaws.com/uifaces/faces/twitter/sur4dye/128.jpg' } ]
    

    查看数据库中的User表:

    node-sequelize-examples=# select * from "User";
     UserId |          UserEmail           |                             UserAvatar                              
    --------+------------------------------+---------------------------------------------------------------------
          1 | Korey31@hotmail.com          | https://s3.amazonaws.com/uifaces/faces/twitter/markretzloff/128.jpg
          2 | Tevin_Wintheiser81@yahoo.com | https://s3.amazonaws.com/uifaces/faces/twitter/faisalabid/128.jpg
          3 | Cody47@yahoo.com             | https://s3.amazonaws.com/uifaces/faces/twitter/sur4dye/128.jpg
    (3 rows)
    

    如您所见,您可以将具有驼峰式字段的users 发送到前端。 User 表中的列使用 PascalCase。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 2014-04-26
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多