未定义推送到数组 - 使用 ExpressJs 和 MySQL 的基本应用程序
Undefined push to array - Basic Application using ExpressJs and MySQL
首先,我必须告诉你我在这个“宇宙”中是个菜鸟。我正在使用:ExpressJs、MySql、Body-Parser、Express-session、Ejs 模板,用于在 Node.
中创建基本联系人应用程序
我的数据库由 3 个表组成:
- 用户(user_id,名字,名字,用户名,密码)
- 联系人(ct_id,名字,名字,phone 麻木。)
- user_contacts (user_id, ct_id) --> 用户和联系人的外键
我想在 /myProfile 页面上列出有关用户及其联系人的所有详细信息。
我不知道如何处理 select 查询。
所以,在一些文档之后我这样做了:
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: You have an error in your SQL syntax;
..当 queryArray.length > 1
我搜索了一下,是关于Multiple statement queries的东西,但是我不知道怎么解决。
编辑 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
})
});
但是现在我的数组包含未定义的对象??任何解决方案?
也许与范围有关?
我的结果:
- 发送数据到数组
- 发送数据到数组
- [未定义,未定义]
- 正在创建数据
- 正在创建数据
我在创建对象之前将其推送到数组。怎么可能?
1797,
我注意到您有几个小查询可以获取给定用户的联系信息。您可以通过将查询组合成一个查询来简化代码。通常 1 个大查询效率更高(而且更易于维护)。我正在使用连接。 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
});
});
首先,我必须告诉你我在这个“宇宙”中是个菜鸟。我正在使用:ExpressJs、MySql、Body-Parser、Express-session、Ejs 模板,用于在 Node.
中创建基本联系人应用程序我的数据库由 3 个表组成:
- 用户(user_id,名字,名字,用户名,密码)
- 联系人(ct_id,名字,名字,phone 麻木。)
- user_contacts (user_id, ct_id) --> 用户和联系人的外键
我想在 /myProfile 页面上列出有关用户及其联系人的所有详细信息。 我不知道如何处理 select 查询。
所以,在一些文档之后我这样做了:
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: You have an error in your SQL syntax;
..当 queryArray.length > 1
我搜索了一下,是关于Multiple statement queries的东西,但是我不知道怎么解决。
编辑 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
})
});
但是现在我的数组包含未定义的对象??任何解决方案? 也许与范围有关?
我的结果:
- 发送数据到数组
- 发送数据到数组
- [未定义,未定义]
- 正在创建数据
- 正在创建数据
我在创建对象之前将其推送到数组。怎么可能?
1797,
我注意到您有几个小查询可以获取给定用户的联系信息。您可以通过将查询组合成一个查询来简化代码。通常 1 个大查询效率更高(而且更易于维护)。我正在使用连接。 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
});
});