繁体   English   中英

这个函数变得未定义,我不知道为什么

[英]This function becomes undefined and I don't know why

我正在尝试使用 javascript、EJS 和 SQL(PostgreSQL) 制作程序,但我遇到了一个问题,该问题使我的服务器崩溃,使我无法更进一步。

.query( SELECT * FROM public.games WHERE id= ${highscore.gameid} ) ^ TypeError: Cannot read properties of undefined (reading 'gameid')

这是我的错误

我试图从我的数据库中删除数据并尝试更改此功能我也尝试将其删除,但它只会让我的代码更加混乱。 同样奇怪的是,我的代码有效,但第二天我得到了这个错误。

const getHighscore = async (id) => {
  let highscore;
  const pool = new Pool(credentials);

  await pool
    .query(`SELECT * FROM public.highscores WHERE id= ${id}`)
    .then((res) => {
      console.log(res.rows[0]);
      highscore = res.rows[0];
    });
  await pool
    .query(`SELECT * FROM public.games WHERE id= ${highscore.gameid}`)
    .then((res) => (highscore.game = res.rows[0]));

  return highscore;
};

Console.log(res.row[0]) = undefined

Console.log(res) = Result {
  command: 'SELECT',
  rowCount: 0,
  oid: null,
  rows: [],
  fields: [
    Field {
      name: 'id',
      tableID: 24601,
      columnID: 1,
      dataTypeID: 23,
      dataTypeSize: 4,
      dataTypeModifier: -1,
      format: 'text'
    },
    Field {
      name: 'username',
      tableID: 24601,
      columnID: 2,
      dataTypeID: 1043,
      dataTypeSize: -1,
      dataTypeModifier: 34,
      format: 'text'
    },
    Field {
      name: 'gameid',
      tableID: 24601,
      columnID: 3,
      dataTypeID: 23,
      dataTypeSize: 4,
      dataTypeModifier: -1,
      format: 'text'
    },
    Field {
      name: 'score',
      tableID: 24601,
      columnID: 4,
      dataTypeID: 23,
      dataTypeSize: 4,
      dataTypeModifier: -1,
      format: 'text'
    },
    Field {
      name: 'active',
      tableID: 24601,
      columnID: 5,
      dataTypeID: 16,
      dataTypeSize: 1,
      dataTypeModifier: -1,
      format: 'text'
    },
    Field {
      name: 'date',
      tableID: 24601,
      columnID: 6,
      dataTypeID: 1082,
      dataTypeSize: 4,
      dataTypeModifier: -1,
      format: 'text'
    }
  ],
  _parsers: [
    [Function: parseInteger],
    [Function: noParse],
    [Function: parseInteger],
    [Function: parseInteger],
    [Function: parseBool],
    [Function: parseDate]
  ],
  _types: TypeOverrides {
    _types: {
      getTypeParser: [Function: getTypeParser],
      setTypeParser: [Function: setTypeParser],
      arrayParser: [Object],
      builtins: [Object]
    },
    text: {},
    binary: {}
  },
  RowCtor: null,
  rowAsArray: false
}

根据您的日志,错误似乎与预期一致。 您将highscore设置为res.rows[0] ,这是undefined 因此, highscore上不存在gameid属性,因此出现错误。

如果res.rows应该包含您的数据,那么基本上现在您没有取回所需的数据或者它不存在。

更好的方法可能是仅在highscore不是 undefined 或 null 并且gameid属性存在时才进行此查询:

if (highscore && highscore.hasOwnProperty('gameid'))
 await pool
    .query(`SELECT * FROM public.games WHERE id= ${highscore.gameid}`)
    .then((res) => (highscore.game = res.rows[0]));

但请记住,即使它是undefined仍然会返回highscore ,因此您的函数可能会返回undefined

您也可以改用可选链接

`SELECT * FROM public.games WHERE id= ${highscore?.gameid}`

这样做可以避免由于未定义highscore而导致的错误,但这将是不必要的查询调用

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM