晚上筹码!今晚我决定玩一些NodeJS,我在理解在这种情况下处理错误的适当方法时遇到了一些麻烦。
我有一个只存储playerName
的表,名称必须是唯一的。因此,我不想仅仅尝试插入并获取错误,而是首先进行选择,如果得到结果,则向用户返回400并让他们知道名称已存在。如果没有,继续正常,插入名称,然后返回203。
我清楚地知道不起作用。我试过尝试/捕获,但没有用。我显然无法使用我正在使用的方法返回错误。那么有什么好办法呢?
router.post('/addPlayer' , function(req, res, next){
var playerName = req.body.name;
if(playerName === undefined || playerName.length === 0)
{
return res.status(400).send('No name provided');
}
var query = 'SELECT name FROM players WHERE name LIKE ?';
var inserts = [playerName];
query = connection.format(query , inserts);
connection.query(query, function(err, results){
if(err) return res.status(500).send('Error connecting to database.');
if(results.length !== 0) return res.status(400).send('This name has already been used.');
});
query = 'INSERT INTO players (name) VALUES(?)';
inserts = [playerName];
query = connection.format(query , inserts);
connection.query(query, function(err){
if(err) return res.status(500).send('Error connecting to database.');
});
res.status(201).send("Added player: " + playerName);
});
在当前版本中,我明显的问题是Node crashes抱怨无法在已经发送之后设置标头。我知道我需要做什么。这是结束路由的执行并将错误返回给浏览器,但我不清楚如何最好地去做。
我正在使用Express框架和mysql。
感谢。
答案 0 :(得分:0)
发送错误(错误)本身有什么问题吗?例如:
if (err)
res.send(err);
答案 1 :(得分:0)
问题是你并行运行两个查询。因此INSERT
在收到SELECT
的响应之前执行。这意味着存在竞争条件。两个查询都尝试发送res.status()
,但是一个会在另一个查询之后发生,这会导致错误。
要解决此问题,请等到收到SELECT
后再执行INSERT
:
var query = 'SELECT name FROM players WHERE name LIKE ?';
var inserts = [playerName];
query = connection.format(query , inserts);
connection.query(query, function(err, results){
if(err) return res.status(500).send('Error connecting to database.');
if(results.length !== 0) return res.status(400).send('This name has already been used.');
query = 'INSERT INTO players (name) VALUES(?)';
inserts = [playerName];
query = connection.format(query , inserts);
connection.query(query, function(err){
if(err) return res.status(500).send('Error connecting to database.');
res.status(201).send("Added player: " + playerName);
});
});