在nodejs中返回错误响应

时间:2015-05-15 01:11:44

标签: mysql node.js express

晚上筹码!今晚我决定玩一些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。

感谢。

2 个答案:

答案 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);
    });
});