JSON.parse 无法使用 knex where 子句

JSON.parse not working with knex where clause

我正在使用 knex 创建动态删除功能。

编辑:函数是从 GraphQL 突变调用的,tableName 和 whereClause 都是字符串。在下面经过编辑的代码中,出于测试和演示目的,我覆盖了 whereClause。

export const deleteRecords = async (tableName, whereClause) => {
  try {

    // Edit: testing with json string
    const whereClauseString = JSON.stringify('{id: 1000}');
    console.log(whereClauseString); // outputs "{id: 1000}"

    const whereClauseObject = JSON.parse(whereClauseString);
    console.log(whereClauseObject);
    console.log(whereClauseString); // outputs {id: 1000}

    await connection
      .from(tableName)
      .where(whereClauseObject)
      .del()
      .then(count => {
        const successMessage = `SUCCESS: ${count} records deleted from ${tableName}.`;
        console.log(successMessage);
      });
  } catch (err) {
    console.error(err);
  }
};

但是,我收到此错误: “语法错误:位置 1 JSON 中的意外标记 i”

编辑:在传入的 json 字符串上使用 JSON.stringify 后,我现在得到以下错误

UnhandledPromiseRejectionWarning: TypeError: 运算符“undefined”是不允许的

出于某种原因,似乎 JSON.parse 没有创建 knex

支持的对象

字符串 '{id: 1000}' 不是 JSON。 JSON 没有不带引号的键。正确的应该是 '{"id": 1000}'.

JSON.parse('{id: 1000}');

这不能解析为 JSON,因为位置 1 中的 i 本应是双引号。

Chrome 说 "SyntaxError: Unexpected token i in JSON at position 1" 在这种情况下,Firefox 说 "SyntaxError : JSON.parse: 属性 名称或 '}' 在 JSON 数据的第 1 行第 2 列".

怎么办?

  1. 不要手动构建 JSON。始终使用 JSON.strigify() 或类似的并从数据结构构建它。
  2. 分离你的顾虑。运行查询的函数不应该也是解析 JSON 的函数。这是不必要的限制,因为即使您手边已经有一个对象,您也被迫传入 JSON:您需要调用 deleteRecords('table', JSON.stringify(myData)) 以便 deleteRecords() 可以立即调用 JSON.parse() 再次。 deleteRecords() 应该期望一个对象作为输入。将任何 JSON 解析为应该是调用者的任务。
  3. 确保在使用 async 时使用 await。切勿缺一不可。

更好:

export const deleteRecords = async (tableName, whereClause) => {
  try {
    const count = await connection.from(tableName).where(whereClauseObject).del();
    const successMessage = `SUCCESS: ${count} records deleted from ${tableName}.`;
    console.log(successMessage);
  } catch (err) {
    console.error(err);
  }
};