mysql - nodejs 返回错误响应

标签 mysql node.js express

晚上堆!今晚我决定尝试使用一些 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/

相关文章:

node.js - 无法通过中间件检索添加到请求对象的值

php - 如何在php中查看其他用户的个人资料?

java - 如何解决无法连接到/192.168.15.186(端口80): connect failed: ETIMEDOUT (Connection timed out) in Windows Firewall

javascript - 无法从 src 文件夹运行简单的 babel 到 dist

multithreading - Nodejs中的单线程是什么意思

ajax - 无法让 gulp 使用浏览器同步来刷新 Express 服务器和 json

javascript - Express 不提供静态文件

php - SQL查询使值单调?

mysql - 数据库反规范化机会

json - 通过唯一的响应从多个文件获取 JSON 数据