Node.js Mysql2 Возвращает фиктивные (?) Данные со строками - PullRequest
0 голосов
/ 28 февраля 2020

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
  • Индекс узла. js
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 ]

Что-то не так с моим кодом? или лучше написать чистый код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...