TODO
Вызовите процедуру из Mariadb и получите значение параметра out.
Ожидается
Получите только значение out. Например,
var foo = rows.val;
Фактический
Возвращает значение с ResultSetHeader
объектом.
Источник
CREATE PROCEDURE `API_TO_WEB_AUTH_USER`(
IN `_id` VARCHAR(50),
IN `_password` VARCHAR(300),
IN `_refresh_token` VARCHAR(500),
IN `_signInMacAddr` VARCHAR(50),
OUT `_Result` INT,
OUT `_ERR_Message` VARCHAR(2048)
)
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION
BEGIN
ROLLBACK;
SET _Result = -1;
GET DIAGNOSTICS CONDITION 1 @sqlstate = RETURNED_SQLSTATE, @errno = MYSQL_ERRNO, @text = MESSAGE_TEXT;
SET _ERR_Message = @text;
END;
SELECT
COUNT(*) INTO _Result
FROM
`User`
WHERE
id = _id AND `password` = SHA2(_password, 256) AND enabled = 1;
START TRANSACTION;
IF (_Result > 0) THEN
UPDATE
`User`
SET
updateDatetime = CURRENT_TIMESTAMP,
signInMacAddr = _signInMacAddr,
refreshToken = _refresh_token
WHERE
id = _id;
END IF;
COMMIT;
END
const Mariadb = require('mysql2');
const pool = Mariadb.createPool({
host: '---.---.---.---',
user: '----',
password: '----',
database: '----',
multipleStatements: true
})
pool.getConnection((err, connection) => {
if (err) {
console.log('connection err', err);
return;
}
connection.promise().query(
`
SET @Result = -1;
SET @ERR_Message = '';
CALL API_TO_WEB_AUTH_USER(?, ?, ?, ?, @Result, @ERR_Message);
SELECT @Result, @ERR_Message;
`,
['ID_SAMPLE', 'PW_SAMPLE', 'refresh_token', 'MAC_ADDR'])
.then(([rows, fields]) => {
console.log('rows', rows);
for(var i = 0; i < rows.length; i ++) {
if (rows[i].length !== undefined && rows[i].length > 0) {
return [rows[i][0]['@Result'], rows[i][0]['@ERR_Message']];
}
}
return null;
})
.then(result => {
console.log('result: ', result);
})
.catch(err => {
console.log('err', err);
})
})
Результат печати
rows [ ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 10,
warningStatus: 0 },
ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 10,
warningStatus: 0 },
ResultSetHeader {
fieldCount: 0,
affectedRows: 0,
insertId: 0,
info: '',
serverStatus: 10,
warningStatus: 0 },
[ TextRow { '@Result': 1, '@ERR_Message': null } ] ]
result: [ 1, null ]
Что-то не так с моим кодом? или лучше написать чистый код?