未定义推送到数组-使用ExpressJ和MySQL的基本应用程序

时间:2018-10-23 00:40:43

标签: mysql node.js express express-session body-parser

首先,我必须告诉你,我在这个“宇宙”中是个傻瓜。我正在使用:ExpressJs,MySql,Body-Parser,Express-session,Ejs模板在Node中创建基本联系人应用程序。

我的数据库由3个表组成:

  • 用户(用户名,名字,名字,用户名,密码)
  • 联系人(ct_id,名字,名字,电话号码)
  • user_contacts(用户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

我进行了搜索,这与多语句查询有关,但是我不知道如何解决。

编辑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 :(得分:0)

1797,

我注意到您有几个小查询正在获取给定用户的联系信息。您可以通过将查询合并为一个查询来简化代码。通常,一个大查询效率更高(而且更易于维护)。我正在使用联接。 More info here

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
    });
});