我正在尝试使用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中)对象限制为仅限于模型中的那些属性?
答案 0 :(得分:0)
我不确定我是否正确理解了您的问题。如果您希望在返回时排除某些属性。您可以将attributes.exclude
中的某些属性作为数组排除。
Widget.findAll({
where,
order,
limit,
attributes: {
include: [],
exclude: []
}
})