晚装!今晚我决定玩一些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崩溃抱怨无法设置已经发送的标头。我知道我该怎么做。即结束路由的执行并将错误返回给浏览器,但我不清楚如何最好地做到这一点。
我正在使用Express框架和mysql。
谢谢。
问题是您正在并行运行两个查询。因此,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);
});
});
发送错误(err)本身有什么问题吗?例如:
if (err)
res.send(err);