我正在通过从html表单发送值来测试我的数据库。唯一的插入很好,连接也很好。我的问题是,当我出于测试目的故意发送重复的(用户名)时,我会收到一条错误消息。这太完美了!
然而,我想找出原因,这恰好是关键。error是一个根据typeof(error)的对象。具体如下:
错误:插入Users
(password
、role
、username
)值('1112131234434'、'basic'、'Cthulu')-密钥'username'的重复条目'Cthuru'
- 在用json.stringify将对象转换为json后,我尝试提取密钥。但唯一保存的值是:{"code":"ER_DUP_ENTRY","errno":1062,"sqlState":"#23000"}消息的其余部分发生了什么?我可以不将整个错误转换为字符串吗?然后用子字符串搜索关键字?还是我走错了路
2。此外,我写了一个函数来遍历对象的键,但这个对象看起来是一个字符串,但它不是。我似乎无法提取字符串,特别是字符串的这一部分:上面错误的"'key'username'">。
需要明确的是,我的目标是将密钥"用户名"发送回客户端表单,以表明他的用户名已被占用。我以后也必须对电子邮件做同样的处理,因此我想要钥匙。
edit:我认为我必须使用GET DIAGNOSTICS的存储过程。与本文类似。
所以这(我认为)很难看。但我有的解决方案,它有效是我创建了一个存储过程(在mysql中),其中包括GET DIAGNOSTICS命令。
DELIMITER //
DROP PROCEDURE IF EXISTS `insert_new_user` //
CREATE PROCEDURE `insert_new_user` (uname VARCHAR(45), pass CHAR(96), r varchar(15))
BEGIN
/**
Return field that has triggered the error, otherwise, return good
**/
-- Declare variables to hold diagnostics area information
DECLARE code CHAR(5) DEFAULT '00000';
DECLARE msg TEXT;
DECLARE rows INT;
DECLARE result TEXT;
-- Declare exception handler for failed insert
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION
BEGIN
GET DIAGNOSTICS CONDITION 1
code = RETURNED_SQLSTATE, msg = MESSAGE_TEXT;
END;
-- Perform the insert
INSERT INTO Users(username, password, role) VALUES (uname, pass, 'full');
-- Check whether the insert was successful
IF code = '00000' THEN
GET DIAGNOSTICS rows = ROW_COUNT;
SET result = CONCAT('insert succeeded, row count = ',rows);
ELSE
SET result = CONCAT('insert failed, error = ',code,', message = ',msg);
END IF;
-- Say what happened
SELECT result;
END //
顺便说一句,我确实根据需要复制和修改了代码——我希望我记得这个网站。。。
然后在我的快递服务器上,我写了一份knex.raw(…)声明。在中
.then(result => { ... })
函数(因为knex是一个承诺)我通过调用getError(result)函数来检查结果是否有错误。如果它有错误,它会给我密钥,在我的情况下:"username"。(为了没有错误,我仍然需要做另一种选择)即
---控制台输出——无错误
ERR_str:[["result":"insert successed,row count=1"}],{"fieldCount":0,"affectedRows":0、"insertId":0和"info":","serverStatus":2,"warning……它在上运行
---最终输出-------
仅供参考,以下是错误1062发生时的控制台输出
---控制台输出--1062错误
ERR_str:[["result":"insert failed,error=23000,message=密钥'username'的重复条目'leerman2'"}],{"fieldCount":0,"affectedRows":0、"insertId":0和"info":","serverStatus":2,"warningStatus":0}]、[["_b…它在上运行
---最终输出-------
这是提取密钥的代码:
function getError(err) {
const ERR_str = JSON.stringify(err);
console.log(`Entered getError() function...proceeding to exctract error...`);
console.log(`ERR_str: ${ERR_str}`);
console.log(`Error is string. [typeOf(ERR_str)]: ${typeof(ERR_str)}. (Attempting to exctract key...`);
const START = (ERR_str.indexOf('key')) + 'key'.length + 2; // 2 including spaces
console.log(`Start: ${START}`);
const END = ERR_str.indexOf(`'"}`);
console.log(`End: ${END}`);
const KEY = ERR_str.substr(START, END - START);
console.log(`key to return to server: ${KEY}`);
return KEY || 0;
}
不是最干净的代码,但这是一个良好的开端。我现在可以将它发送到Angular并按预期使用它。如果有人发现这种方法有什么问题,请随时告诉我。