Неопределенный push to array - базовое приложение с использованием ExpressJs и MySQL - PullRequest
0 голосов
/ 23 октября 2018

Прежде всего, я должен сказать вам, что я довольно нуб в этой "вселенной".Я использую: ExpressJs, MySql, Body-Parser, Express-session, Ejs шаблон для создания приложения базовых контактов в Node.

Моя база данных состоит из 3 таблиц:

  • user (user_id, имя, имя, пароль)
  • контакты (ct_id, имя, имя, номер телефона)
  • user_contacts (user_id, ct_id) -> внешние ключидля пользователя и контактов

Я хочу разместить на странице / myProfile все подробности о пользователе и его контактах.Я не знаю, как обрабатывать запросы выбора.

Итак, после некоторой документации я сделал это:

conn.query('SELECT * FROM user_contacts WHERE user_id= ?', req.session.user_id, function (err, result) { 
        if(err) throw err;
        console.log(result);
        var queryArray = "";
        for(var i = 0; i < result.length; i++){
            queryArray += `SELECT * FROM contacts WHERE ct_id= ${result[i].ct_id}; `;
        }
        console.log(queryArray);
         conn.query(queryArray, function (err, result) { 
             if(err) throw err;
             console.log(result);
             res.render('myProfile/contacts', {
                title: `${req.session.user_nickname}'s Contacts`,
                data:   result
            });
          }); 
     });

Но у меня есть ошибка

ER_PARSE_ERROR: у вас есть ошибка в синтаксисе SQL;

.. когда queryArray.length> 1

Я искал, и это что-то о запросах с несколькими операторами, но я не знаю, как решитьit.

Edit 2:

Я изменяю свой код ..

conn.query('SELECT * FROM user_contacts WHERE user_id= ?', req.session.user_id, function (err, result) { 
        if(err) throw err;
        var datas = [];
        for(var i = 0; i < result.length; i++){
            getContacts    =   function(query){
                conn.query(query, function (err, result) { 
                    console.log('Creating data');
                    data = {
                        user:       req.session.user_nickname,
                        contact:{
                            ct_firstName:   result[0].ct_firstName,
                            ct_SecondName:  result[0].ct_SecondName,
                            ct_PhoneNumber: result[0].ct_PhoneNumber
                        }   
                    }
                    return data;
                 });
            }
            console.log('Send data to array');
            datas.push(getContacts(`SELECT * FROM contacts WHERE ct_id = ${result[i].ct_id}`));
        }
        console.log(datas); // [ undefined, undefined ] 
        res.render('myProfile/contacts',{
            title:  `${req.session.user_nickname}'s profile`,
            data:   datas
        })
     });

Но теперь мой массив содержит неопределенные объекты ??Любое решение?Может быть, что-то в области?

Мой результат:

  • Отправка данных в массив
  • Отправка данных в массив
  • [undefined, undefined]
  • Создание данных
  • Создание данных

Я помещаю объект в массив перед его созданием.Как это возможно?

1 Ответ

0 голосов
/ 25 октября 2018

1797,

Я заметил, что у вас есть несколько небольших запросов, собирающих контактную информацию для данного пользователя.Вы можете упростить свой код, объединив свои запросы в один.Часто 1 большой запрос более эффективен (плюс его легче обслуживать).Я использую соединение. Подробнее здесь .

const contacts = [];

const query = "
SELECT c.*
FROM user_contact uc
JOIN contact c ON uc.contact_id = c.contact_id
WHERE uc.user_id = ?
GROUP BY c.contact_id
";

conn.query(query, req.session.user_id, (err, results) => {
    if (err) throw new Error(err);

    // it seems that this could just be 'contacts = results' since they
    // have the same structure
    contacts = results.map(result => {
        return {
            ct_firstName:   result[0].ct_firstName,
            ct_SecondName:  result[0].ct_SecondName,
            ct_PhoneNumber: result[0].ct_PhoneNumber
        };
    });

    res.render('myProfile/contacts',{
        title: `${req.session.user_nickname}'s profile`,
        data: contacts
    });
});
...