NodeJS с MariaDB, невозможно прочитать свойство 'threadId' из неопределенного - PullRequest
0 голосов
/ 15 декабря 2018

Я совершенно отчаялся из-за этой досадной ошибки.Я не могу найти никакой информации об этом в Интернете.

На самом деле мое приложение работает нормально, но если я запускаю несколько запросов и жду их с 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())

Я не могу положиться наэто, пока я не понимаю ошибку.

Спасибо!

...