Я совершенно отчаялся из-за этой досадной ошибки.Я не могу найти никакой информации об этом в Интернете.
На самом деле мое приложение работает нормально, но если я запускаю несколько запросов и жду их с Promise.all()
, сервер вылетает.Но шаг за шагом:
В моем index.js я инициализирую пул соединений с 60 макс.подключений и экспорт переменной.
const pool = mariadb.createPool(config.mariaDB);
module.exports.pool = pool
Позже я импортирую индексный файл как "app" и использую app.pool.query (...) для запроса к моей базе данных.
Далее у меня есть почтовый запрос /getUsersGroups
.Пользователь может быть членом нескольких групп, поэтому я ожидаю, что ответом будет массив объектов.Каждый объект содержит информацию о группе.Кроме того, внутри этого объекта есть поле членов.Это поле также является массивом, содержащим информацию о членах, поэтому s.th.вот так:
[
{
"groupId": 125758,
"title": "test",
"members": [
{userId: 5, name:Max, }, ...]
}, ...
]
Поэтому у меня есть почтовый запрос, который выглядит так.Я получаю все идентификаторы группы, в которые входит пользователь.Затем для каждого groupId
я вызываю метод Group.groupInfo.
. Это возвращает обещание, поэтому я собираю все обещания в массив и жду их всех перед отправкой ответа.
router.post("/getUsersGroups", (req, res) => {
let userId = req.body.userId;
let result = []
let promises = []
Group.getGroupsByUser(userId) // this gets all group ids the user is a member
.then((item) => {
let groups = item.map(x => objectParser.parseUnderscoreToCamel(x))
for (let i = 0; i < item.length; i++) {
let groupId = item[i].groupId
promises.push( //adding promises
Group.groupInfo(groupId, userId)
.then((item) => {
result.push(item)
})
.catch((err)=>{console.log(err)}))
}
})
.then(() => {
// waiting for all promises to finish
return Promise.all(promises)
.then(() => {
res.status(200).json({groups: result})
})
})
.catch((err) => {
console.log(err)
}
})
}
Итак, Обещание Group.groupInfo
выглядит следующим образом.Сначала он выбирает информацию о группе, а затем для каждого члена группы вызывает другое Обещание User.userInfo
.Шаблон такой же, как в методе выше.Поэтому я помещаю Promise в массив и жду, пока они завершат:
module.exports.groupInfo = (groupId, userId)=>{
let groupInfo = {}
let promises = []
return new Promise(((resolve, reject) => {
app.pool.query("SELECT* FROM Groups WHERE group_id=?", [groupId])
.then((item) =>{
groupInfo = item[0]
groupInfo["members"] = [];
return app.pool.query("SELECT user_id FROM Users_groups WHERE group_id=?", [groupId])
.then((item) =>{
let members = [] //contains all user ids
for(let i=0; i<item.length;i++){
members.push(item[i].userId)
}
members.forEach((memberId)=>{
// for each memberID call User.userInfo
promises.push(User.userInfo(userId,memberId)
.then((item)=>{
groupInfo.members.push(item)}))
}
})
})
})
.then(()=>{
// wait for all Promises
return Promise.all(promises)
})
.then(() =>{
return resolve(groupInfo)
})
.catch((err)=>{
return reject(err)
})
}))
}
User.userInfo
, сам, отправляет запрос в базу данных для сбора информации о пользователе.
ЕслиЯ звоню, сервер вылетает и выдает мне эту ошибку:
activeConnections[conn.threadId] = conn;
TypeError: Cannot read property 'threadId' of undefined
at Pool.handleTaskQueue (****\node_modules\mariadb\lib\pool.js:431:30)
at _combinedTickCallback (internal/process/next_tick.js:132:7)
at process._tickCallback (internal/process/next_tick.js:181:9)
Я думаю, проблема как-то связана с Promise.all()
, верно?Но я не могу найти информацию об этой ошибке.Я благодарен за каждую подсказку!
Мое решение состояло не в том, чтобы использовать Promise.all, а в том, чтобы последовательно вызывать Обещания, но мне это кажется неправильным.
return groupsId.reduce((promise, groupId) => {
return promise.then(() => {
return Group.groupInfo(groupId, userId)
.then((item)=>{
result.push(item)
console.log(result)
})
.catch((err)=>{
throw err
})
})
}, Promise.resolve())
Я не могу положиться наэто, пока я не понимаю ошибку.
Спасибо!