Heroku: сбой проекта Javascript / MySQL по запросу - PullRequest
0 голосов
/ 17 июня 2020

У меня есть Heroku API, написанный на JavaScript, который считывает данные из базы данных MySQL. Раньше это работало, но теперь каждый раз, когда я отправляю запрос к API, я получаю эту ошибку:

2020-06-17T18:37:13.493711+00:00 app[web.1]: > my_api@0.0.0 start /app
2020-06-17T18:37:13.493712+00:00 app[web.1]: > node ./bin/www
2020-06-17T18:37:13.493712+00:00 app[web.1]: 
2020-06-17T18:37:14.977800+00:00 heroku[web.1]: State changed from starting to up
2020-06-17T18:38:40.255982+00:00 app[web.1]: /app/node_modules/mysql2/lib/connection.js:149
2020-06-17T18:38:40.256022+00:00 app[web.1]:     err.fatal = true;
2020-06-17T18:38:40.256023+00:00 app[web.1]:               ^
2020-06-17T18:38:40.256023+00:00 app[web.1]: 
2020-06-17T18:38:40.256026+00:00 app[web.1]: TypeError: Cannot create property 'fatal' on string 'SOCKS: Authentication failed'
2020-06-17T18:38:40.256027+00:00 app[web.1]:     at Connection._handleFatalError (/app/node_modules/mysql2/lib/connection.js:149:15)
2020-06-17T18:38:40.256027+00:00 app[web.1]:     at Connection._handleNetworkError (/app/node_modules/mysql2/lib/connection.js:169:10)
2020-06-17T18:38:40.256027+00:00 app[web.1]:     at SocksConnection.emit (events.js:315:20)
2020-06-17T18:38:40.256029+00:00 app[web.1]:     at /app/node_modules/socksjs/socks.js:146:18
2020-06-17T18:38:40.256029+00:00 app[web.1]:     at Socket.dataReady (/app/node_modules/socksjs/socks.js:93:13)
2020-06-17T18:38:40.256029+00:00 app[web.1]:     at Socket.emit (events.js:315:20)
2020-06-17T18:38:40.256030+00:00 app[web.1]:     at emitReadable_ (_stream_readable.js:556:12)
2020-06-17T18:38:40.256030+00:00 app[web.1]:     at processTicksAndRejections (internal/process/task_queues.js:83:21)
2020-06-17T18:38:40.263200+00:00 app[web.1]: npm ERR! code ELIFECYCLE
2020-06-17T18:38:40.263391+00:00 app[web.1]: npm ERR! errno 1
2020-06-17T18:38:40.264251+00:00 app[web.1]: npm ERR! my_api@0.0.0 start: `node ./bin/www`
2020-06-17T18:38:40.264354+00:00 app[web.1]: npm ERR! Exit status 1
2020-06-17T18:38:40.264471+00:00 app[web.1]: npm ERR! 

Код, о котором идет речь, выглядит так:

function new_db_connection() {
    var sockConn = new SocksConnection(remote_options, sock_options);
    var dbConnection = mysql.createConnection({
    user: 'myusername',
    database: 'mydatabase',
    password: 'mypassword',
    stream: sockConn
});
    return [sockConn, dbConnection];
};


router.get('/myrequest', function(req, res, next) {
    new_conn = new_db_connection();
    dbConnection = new_conn[1];
    sockConn = new_conn[0];
    dbConnection.query('SELECT * from mytable', function(error, results, fields) {
        if (error) {
            res.send(JSON.stringify({
                "status": 500,
                "error": error,
                "response": null
            }));
            //If there is error, we send the error in the error section with 500 status
        } else {
            res.send(JSON.stringify({
                "status": 200,
                "error": null,
                "response": results
            }));
            //If there is no error, all is good and response is 200OK.
        }
        sockConn.dispose();
    });
    dbConnection.end()
});

Я видел аналогичный вопрос задан здесь, и решение заключалось в том, чтобы закрыть соединение, но я делаю закрываю соединение после каждого запроса, поэтому я не знаю, в чем проблема.

Вся помощь приветствуется .

Ответы [ 2 ]

1 голос
/ 26 июня 2020

Вам следует взглянуть на ответ, предоставленный @daniele Rici, вам необходимо правильно завершить соединение; однако исправление этого не решит ваш первоначальный вопрос.

Проблема не в вашем коде. Ваша проблема связана с конфигурацией подключения .

'фатальный' в строке 'SOCKS: Ошибка аутентификации'

Означает, что при аутентификации произошла ошибка.

var sockConn = new SocksConnection(remote_options, sock_options);

при условии, что вы используете npm пакет socks js от https://openbase.io/js/socksjs

Документировано, что правильный способ инициализации sock js подключение осуществляется следующим образом:

var sock = new SocksConnection(remote_options, sock_options); 
var sock = SocksConnection.connect(remote_options, sock_options, connect_handler);
1 голос
/ 20 июня 2020

Попробуйте изменить это

        sockConn.dispose();
    });
    dbConnection.end()
});

в этом

        sockConn.dispose();
        dbConnection.end()
    });
});

Edit: лучше читая ошибку, это может быть проблема где-то еще.

Глядя на строку 'SOCKS: Authentication failed', может быть, вы или удаленная конечная точка SocksConnection что-то изменили при аутентификации?

Надеюсь, это поможет.

...