晚上堆!今晚我决定尝试使用一些 NodeJS,但我在理解在这种情况下处理错误的适当方法时遇到了一些麻烦。
我有一个简单存储 playerName
的表,名称必须是唯一的。因此,我不想只是尝试插入并出现错误,我想先进行选择,如果我得到结果,则向用户返回 400 并让他们知道该名称已经存在。如果不是,则照常继续,插入名称,并返回 203。
我得到的显然不起作用。我尝试了 try/catch,但没有用。而且我显然不能用我正在使用的方法返回错误。那么解决这个问题的好方法是什么?
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 崩溃并提示在发送 header 后无法设置 header 。我知道我需要做什么。这是结束路由的执行并将错误返回给浏览器,但我只是不清楚如何最好地解决这个问题。
我正在使用 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);
});
});
关于mysql - nodejs 返回错误响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30249978/