如何将Sequelize Model.create的结果限制为模型的属性?

时间:2018-02-04 05:08:58

标签: json sequelize.js

我正在尝试使用Sequelize来处理API中的数据层。无论好坏,我有一个超过30列的表,但API用户只需知道(简化这个问题)只有5个。

我构建了一个Sequelize模型,它“暴露”了API用户需要知道的字段(其余的都可以为空):

const Widget = sequelize.define("widget",
  {
    id: { type: Sequelize.INTEGER, primaryKey: true, autoIncrement: true },
    name: { type: Sequelize.STRING },
    active: { type: Sequelize.BOOLEAN },
    created_at: { type: Sequelize.DATE },
    last_modified_at: { type: Sequelize.DATE },
  }, {
    timestamps: false,
    freezeTableName: true,
  }
);

我可以在我的服务层中使用这个模型;事实上,我的API端点通过id获取小部件:

export default async function(widgetId: string): Promise<any> {
  return Widget.findOne({ where: { id: widgetId } });
}

并搜索小部件:

export default async function(name: string): Promise<any> {
  const where: any = {};
  if (name) {
    where.name = name;
  }
  // More stuff here omitted for clarity, e.g., order and limit...
  return Widget.findAll({ where, order, limit });
}
两个都很可爱。每个都返回一个promise,当我从已解析的promise中jsonify值时,生成的widget只包含Sequelize模型中的字段,正如我希望的那样。

const widget = await getWidgetById(widgetId);  // works great (5 fields shown)
const widgets = await getWidgets(name);        // works great (5 fields in each search result)

但是,当创建小部件时,生成的小部件JSON 包含所有30个字段。这不是预期的。服务层调用只是:

export default async function(payload: {}): Promise<any> {
  return Widget.create(payload);
}

我从这样的API处理程序中调用它:

const widget = await createWidget(payload);

JSONified小部件包含全部30个字段。我想将它限制在所需的5个字段中。

现在我确实调查了这个但是在await之后打印了widget的值,我确实看到Sequelize回复了:

widget {
  dataValues: 
   { id: 472304,
     name: 'ABC',
     active: true,
     created_at: 2018-02-04T04:58:31.812Z,
     last_modified_at: 2018-02-04T04:58:31.812Z,
     ======>>>>>> ZILLIONS OF OTHER FIELDS ALL NULL <<<<<<====== },
  _previousDataValues: 
   { name: 'ABC',
     active: true,
     created_at: 2018-02-04T04:58:31.812Z,
     last_modified_at: 2018-02-04T04:58:31.812Z,
     id: 472304 },   <<<<<<====== THIS IS PROMISING
  _changed: 
   { name: false,
     active: false,
     created_at: false,
     last_modified_at: false,
     id: false },
  _modelOptions: 
   { ... },
  _options: 
   { ... },
  __eagerlyLoadedAssociations: [],
  isNewRecord: false }

因此有一些迹象表明Sequelize知道模型中的内容只是表格的一部分。当我将该对象传递给JSON.stringify时,我只得到dataValues部分中的部分,所以我看到的是Sequelize toString的一些有趣的魔法。

深入挖掘该物体对我来说是错误的。

是否有(正确的)方法将Model.create中的“返回”(我知道它在promise中)对象限制为仅限于模型中的那些属性?

1 个答案:

答案 0 :(得分:0)

我不确定我是否正确理解了您的问题。如果您希望在返回时排除某些属性。您可以将attributes.exclude中的某些属性作为数组排除。

Widget.findAll({
  where,
  order,
  limit,
  attributes: {
    include: [],
    exclude: []
  }
})