如果用户名已经存在,我想向mysql数据库进行查询,他应该向我发送一条消息,如果不存在,请向我显示新ID。我想检查查询result.lenght是否高于0。 但是会引发错误“无法读取未定义的属性'length'”
服务文件
const connect = () =>
mysql.createConnection({
host: process.env.MYSQL_HOST,
user: process.env.MYSQL_USER,
password: process.env.MYSQL_PASSWORD,
database: process.env.MYSQL_DATABASE
});
const insert = (conn, user) => {
return conn.query(`insert into user(username, firstName, lastName, password)
values(?,?,?,?)`,
[
user.username,
user.firstName,
user.lastName,
user.password
]
)
}
const getByUsername = username => {
return connect()
.then(conn => {
conn.query(
`select id, username, firstName, lastName
from user
where username = ?`,
[username]
);
})
}
const create = user => {
return getByUsername(user.username)
.then(result => {
if (result.length > 0) {
throw new Error(`User "${user.username}" already exists`);
}
})
.then(() => connect())
.then(conn => insert(conn, user))
.then(result =>
({
id: result.insertId
}));
};
控制器文件
const create = (req, res) => {
userService.create(req.body)
.then(result => {
res.status(200);
res.json(result);
})
.catch(err => {
res.status(500);
res.send('Error ' + err.message);
})
}
我试图定义长度,但是我认为这不是问题。我用邮递员进行查询,并使用mysql作为数据库。我还尝试用username.length替换result.length,但是它会出现“未定义错误的用户名”的问题...
答案 0 :(得分:1)
result
可能在此处未定义。因为我们没有返回正确的查询结果。那就是为什么我们会出错。
解决方案:
const getByUsername = username => {
return new Promise((resolve, reject) => {
connect()
.then(conn => {
conn.query(
`select id, username, firstName, lastName
from user
where username = ?`,
[username],
function(err, results) {
if (err) {
return reject(err);
}
return resolve(results)
}
);
})
});
}
说明:
根据mysql2文档,conn.query
将不返回结果。 conn.query
方法具有第三个参数,它是一个回调方法。在这里,我们可以获取SQL查询错误和查询结果。
通过使用javascript Promise API,我们可以根据SQL查询结果决定拒绝还是解决。