从ColumnSet访问源对象

时间:2019-06-19 07:58:11

标签: node.js pg-promise

当我导入带有ColumnSet中Column的initCB属性的数据时,我尝试在记录集中拆分一个子对象。

但是当我对两个不同的目的地名称使用两个不同的init函数但一个源时,我得到的结果相同。

const cs = new pgp.helpers.ColumnSet([
  'id',
  { name: 'source_id', prop: 'source', init: function(obj) { return obj.value.id; } },
  { name: 'source_name', prop: 'source', init: function(obj) { return obj.value.name; } },
], { table: 'test_table' });

const data = [
  { id: 1, source: { id: 1, name: 'source1' } },
  { id: 2, source: { id: 1, name: 'source1' } },
  { id: 3, source: { id: 2, name: 'source2' } },
];

const insert = pgp.helpers.insert(data, cs);

结果是:

INSERT INTO "test_table"("id","source_id","source_name") VALUES
  (1,'source1','source1'),
  (2,'source1','source1'),
  (3,'source2','source2')

而不是预期的:

INSERT INTO "test_table"("id","source_id","source_name") VALUES
  (1,1,'source1'),
  (2,1,'source1'),
  (3,2,'source2')

似乎是对SAME源字段的回调函数的第二次调用,覆盖了先前在THIS源字段上调用ANOTHER回调函数的结果。

如何避免这种情况? 还是有另一种在导入过程中拆分子对象的方法?

1 个答案:

答案 0 :(得分:1)

选项prop并非完全如此。可以将value重映射到其他属性名称,但不提供直接的对象引用。

相反,请使用column descriptor的属性source来引用源对象。具有讽刺意味的是,您也在数据source中调用了该属性,这意味着您必须在引用中两次使用source

const cs = new pgp.helpers.ColumnSet([
    'id',
    {name: 'source_id', init: c => c.source.source.id},
    {name: 'source_name', init: c => c.source.source.name}
], {table: 'test_table'});

第一个sourcepg-promise API所支持的,第二个是您的数据列名称:)

此外,根据documentation,API会将sourcethis设置为相同,因此,如果您更喜欢ES5函数语法(在示例中看起来更简洁),则可以而是这样做:

const cs = new pgp.helpers.ColumnSet([
    'id',
    { name: 'source_id', init: function() {return this.source.id;}},
    { name: 'source_name', init: function() {return this.source.name;}},
], { table: 'test_table' });

在上方this指向源数据对象。