#javascript #heroku
Вопрос:
У меня возникла странная проблема, когда я создал базовый API Nodejs, который я пытаюсь разместить на Heroku, который отлично работает с локальной точки зрения, но как только я пытаюсь протестировать Heroku, я получаю ошибку аутентификации при попытке подключения к MySQL.
Из того, что я вижу, при выполнении тестов почтальона Heroku добавляет информацию к моей информации о подключении, которая затем вызывает сбой аутентификации. Аутентификация в самом API работает, но не удается установить соединение с MySQL.
const express = require('express');
const mysql = require('mysql');
const cors = require('cors');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');
const utils = require('./utils');
const app = express();
const leadsdb = mysql.createPool({
host: "hostIP",
user: "username",
password: "password",
database: "database",
});
const port = process.env.PORT || 4000;
// enable CORS
app.use(cors());
// parse application/json
app.use(bodyParser.json());
// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true }));
app.post("/api/register", (req, res) => {
const firstName = req.body.firstName
const lastName = req.body.lastName
const email = req.body.email
const number = req.body.number
const country = req.body.country
const age = req.body.age
const occupation = req.body.occupation
const sqlInsert = "INSERT INTO Leads (FirstName, LastName, Email, Country, Phone, Age, Occupation) VALUES (?,?,?,?,?,?,?)"
leadsdb.query(sqlInsert, [firstName, lastName, email, country, number, age, occupation], (err, result) => {
if(!result) {
res.send(err)
}
else {
res.send(result)
}
})
{
"code": "ER_ACCESS_DENIED_ERROR",
"errno": 1045,
"sqlMessage": "Access denied for user 'username'@'ec2-54-170-17-28.eu-west-1.compute.amazonaws.com' (using password: YES)",
"sqlState": "28000",
"fatal": true}
Если я не ошибаюсь, » @ «ec2-54-170-17-28.eu-west-1.compute.amazonaws.com» не должно быть включено в регистрационную информацию, и она не была передана в том месте, где указано соединение с БД.
Я не знаю, достаточно ли этой информации, поэтому, пожалуйста, спрашивайте обо всем, что может понадобиться. Буду признателен за любую помощь.
Комментарии:
1. вам необходимо предоставить этому пользователю доступ к вашей базе данных. Или вам необходимо полностью указать пользователя для входа в систему, используя формат «пользователь@имя хоста». Вероятно, вы разрабатывали локально на своем собственном компьютере, поэтому он автоматически использовал для вас «имя пользователя@localhost». Но теперь у вас есть база данных в облаке, поэтому вам нужно соответствующим образом изменить свой логин.
2. База данных, к которой я подключаюсь, размещена на панели управления hostgator для веб-сайта, который я размещаю для друга. С этой подпиской у меня может быть много SQL-серверов, поэтому я использовал их в целях тестирования. Поэтому, когда я подключаюсь к базе данных из локальной установки, она вызывает базу данных на сервере hostgator, которая работает, но не будет работать при передаче той же информации через Heroku.
3. Как вы перенесли базу данных из разработки в Heroku? Можем ли мы предположить, что вы перешли через одну и ту же таблицу пользователей и у нее одинаковые учетные записи для входа?
4. Ну, я не пытаюсь использовать базу данных из Heroku, я пытаюсь получить внешнюю базу данных в ее нынешнем виде. Таким образом, подключение к базе данных вообще не изменилось
5. Вам просто нужно полностью подтвердить свой логин в БД, чтобы имя хоста не добавлялось автоматически для вас. Вам нужно посмотреть таблицу пользователей вашей базы данных и посмотреть поле Хоста для вашей записи пользователя. Независимо от того, какое имя хоста указано в этом поле, вы должны указать его при входе в систему пользователя.
Ответ №1:
Я вижу, что вы не указали port
. При подключении к удаленной базе данных Heroku вы должны использовать эти поля:
host: 'localhost',
port: 3306,
user: 'root',
password: '',
database: 'db_name',
insecureAuth: true
существует также один вариант, при котором вы создали строку подключения, например
DATABASE_URL=mysql2://username:password@ip.goes.here/data_base_name --app heroku-app-name
и укажите это в своем файле .env.
Это значительно облегчает процесс.
Комментарии:
1. Спасибо тебе за это, но я все равно ничего не боюсь. У меня был указан порт раньше, но он также не работал в то время, я взял его для тестирования. Я попытался использовать подход с URL-адресом базы данных, но, похоже, он по-прежнему переопределяет IP-адрес с информацией о подключении amazon. Я тоже пытался использовать информацию о домене, но все равно ничего.
2. Подробнее об api NodeJS для MySQL читайте здесь stayregular.net/blog/…
Ответ №2:
Я понял, что у Hostgator есть правила белого списка IP-адресов для удаленного доступа к размещенным серверам SQL. Таким образом, Heroku ничего не добавлял к соединению, сервер фактически отвечал, говоря, что соединение не разрешено с запрашивающего имени хоста.
Я ценю всю помощь и прошу прощения за то, что потратил время тех, кто мне помог.