UnhandledPromiseRejectionWarning:错误:属性“密码”不存在。 pg-承诺

时间:2019-02-26 11:12:45

标签: javascript pg-promise

我正在使用pg-promise。

尝试插入以下Javascript数组时遇到问题:

[ { email: 'test1@gmail.com', password: 'test2' },
  { email: 'tes2t@gmx.com', password: 'test'3 },
  { email: 'test4@gmail.com', password: 'test4' },
  { email: 'test4@yahoo.com.ar', password: 'test5' }]

使用以下内容:

async function insertDB(data){
  const cs = new pgp.helpers.ColumnSet(['email', 'password'], {table: 'users'});
  console.log(data)
  const query = pgp.helpers.insert(data, cs);

  db.none(query)
      .then(data => {
          logger.info(" Query success: ", data);
  })
  .catch(error => {
      logger.warn(" Query error: ", error);
  });
}

我明白了

UnhandledPromiseRejectionWarning:错误:属性“密码”不存在。

**data.password = undefined**
**data[0] = { email: 'test1@gmail.com', password: 'test2' }**

如何将这些数据插入我的postgresdb?

1 个答案:

答案 0 :(得分:0)

// should create columnsets only once:
const cs = new pgp.helpers.ColumnSet(['email', 'password'], {table: 'users'});

function insertDB(data) {

  // wrapping it into a function is safer, for error-reporting via query methods:
  const query = ()=> pgp.helpers.insert(data, cs);

  db.none(query)
      .then(data => {
          // data = null always here, no point displaying it
          logger.info('Query success:', data);
  })
  .catch(error => {
      logger.warn('Query error:', error);
  });
}

在这种情况下,您的函数不需要async

  

UnhandledPromiseRejectionWarning:错误:属性“密码”不存在。

您会混淆JavaScript编译器,将函数声明为async,然后由于缺少属性password而在生成插入内容时同步引发错误。

例如,如果要插入一些没有密码的记录,请使用null,如下所示定义列集:

const cs = new pgp.helpers.ColumnSet([
    'email',
    {name: 'password', def: null}
], {table: 'users'});

除此之外,键入ColumnSet最终是灵活的,请参阅每个包含的Column的文档。

额外

如果您想使用服务器端的DEFAULT值来丢失密码,可以在Custom Type Formatting的帮助下提供:

const DEFAULT = {rawType: true, toPostgres: ()=> 'DEFAULT'};

然后您的password列可以这样定义:

{name: 'password', def: DEFAULT}

还有很多选择,Column支持属性initmod