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 列".
怎么办?
- 不要手动构建 JSON。始终使用
JSON.strigify()
或类似的并从数据结构构建它。
- 分离你的顾虑。运行查询的函数不应该也是解析 JSON 的函数。这是不必要的限制,因为即使您手边已经有一个对象,您也被迫传入 JSON:您需要调用
deleteRecords('table', JSON.stringify(myData))
以便 deleteRecords()
可以立即调用 JSON.parse()
再次。 deleteRecords()
应该期望一个对象作为输入。将任何 JSON 解析为应该是调用者的任务。
- 确保在使用
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);
}
};
我正在使用 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 列".
怎么办?
- 不要手动构建 JSON。始终使用
JSON.strigify()
或类似的并从数据结构构建它。 - 分离你的顾虑。运行查询的函数不应该也是解析 JSON 的函数。这是不必要的限制,因为即使您手边已经有一个对象,您也被迫传入 JSON:您需要调用
deleteRecords('table', JSON.stringify(myData))
以便deleteRecords()
可以立即调用JSON.parse()
再次。deleteRecords()
应该期望一个对象作为输入。将任何 JSON 解析为应该是调用者的任务。 - 确保在使用
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);
}
};