В настоящее время я сталкиваюсь с очень странным поведением, которое я не могу понять. Моя установка: микросервис, использующий узел 10.18.1 и knex js v0.20.10, для доступа к БД, которая является mysql 5,7 дБ
Ошибка Для локальных тестов , у меня есть docker -композитный файл, который создает все изображения, включая мой проект. Проблема, которая у меня есть, заключается в том, что каждый раз, когда я пытаюсь получить информацию из БД, образ моего проекта уничтожается. После просмотра журналов я увидел следующее сообщение от mysql:
mysql | 2020-03-12T00:40:18.457996Z 2 [Note] Aborted connection 2 to db: <DB_NAME> user: 'root' host: '172.18.0.3' (Got an error reading communication packets)
. Мне удалось сузить проблему до следующих частей кода:
async function getUser (condition) {
console.log('>> here', condition)
const users = await knexClient(TABLE_NAME).where(condition) //<-- all good here
const user = users[0] //<-- still nothing wrong
console.log('>', user) // <-- i can see the user from the DB
await sleep(10000) // <-- It can even wait for 10 s
return users.pop() // <-- BOOM!
// return null // <-- If i return null, there is no error!?!?!? wtf?
}
```
Вызов функции
async function getByEmail (email) {
**const user = await getUser({ email })**
if (user == null) {
throw applicationErrors.notFoundError('User not found or is not activated')
}
return user
}
В основном проблема, с которой я сталкиваюсь, заключается в том, что каждый раз, когда я пытаюсь вернуть найденного пользователя в БД, я получаю ошибку mysql (ошибка чтения пакетов связи). После возникновения этой ошибки мое docker изображение останавливается, поскольку завершается с кодом состояния 0.
Забавный факт
Когда я запускаю тот же исходный код с тем же В конфигурации Knex, указывающей на локальный mysql docker образ, ошибка никогда не возникает!
Мой docker файл имеет следующий вид:
FROM node:10-alpine
ADD . /app
WORKDIR /app
RUN npm i --only=prod
RUN rm -rf ./config/local.json
RUN rm -rf ./docker-compose.override.yml
CMD ["npm", "start"]
И моя docker -композиция выглядит так:
version: "3"
services:
app:
build: .
container_name: <SERVICE_NAME>
ports:
- "9000:9000"
# expose:
# - 9000
depends_on:
- mysql
mysql:
image: mysql:5.7.13
container_name: mysql
command: --default-authentication-plugin=mysql_native_password
restart: unless-stopped
volumes:
- mysql:/var/lib/mysql
- "./infrastructure/docker/initdb.sql:/docker-entrypoint-initdb.d/init.sql"
environment:
- MYSQL_ROOT_PASSWORD=password
ports:
- "3306:3306"
# expose:
# - 3306
volumes:
mysql:
Любая помощь или предложение, будут высоко оценены!