Jam*_*tes 2 javascript mysql json node.js mysql2
我正在尝试将一个 JSON 对象插入到 MySQL JSON 列中,我得到: Invalid JSON text: "Invalid escape character in string."
有问题的字符是\n对象的这一部分:
"summary":"Summary of Qualifications:\nAccomplished and results-driven General Business Director with a consistent track record."
我尝试过 JSON.stringify、JSON_OBJECT、JSON_QUOTE,最近的尝试包括:
summary.replace("\n", "\\n")以及用适当的替换现有转义字符的变化?转义字符。
如果可能有任何影响,我正在使用 Node、Express 和 JawsDB。
编辑:这是实际的插入代码:
const fields = '(myField)';
const values = `('${JSON.stringify(field.contents || {})}')`;
db.query('INSERT INTO mydb ' + fields + ' VALUES ' + values,
err => {
if (err) {
console.log(values);
throw(err) ;
}
}
);
Run Code Online (Sandbox Code Playgroud)
您正在使用字符串连接构建查询,这是一种危险的(SQL 注入)且容易出错(意外/不正确的字符串转义、字符串中嵌入引号的问题')的做法。
您的查询重写为使用占位符,应该可以正常工作:
db.query('INSERT INTO mydb ' + fields + ' VALUES (?)', [ JSON.stringify(field.contents || {}) ], err ...
Run Code Online (Sandbox Code Playgroud)
潜在的问题是,在 MySQL 文字字符串表达式中,\n并不意味着\+ n,它意味着 ASCII 0x10(换行符)。在 JSON 中,带引号的字符串中的换行符无效——JSON 字符串中的换行符被序列化为两个字符,\+ n——并且 MySQL 的字符串解析器识别出这种模式与 JSON 中的含义相同的事实本质上是巧合,虽然这个约定很常见。在这里,它会咬你,因为你打算向 MySQL 发送两个字符,但解析器会解释它。
您可能已经制定通过了加倍解决此砍死\到\\字符串,该服务器将其解释为文字的\+ n,但允许数据库驱动程序模块来处理任何必要的引号和转义对你来说是更正确的做法。