使用NodeJs查询MySQL时出现“无法设置未定义的属性'长度'的错误”错误

时间:2019-09-03 01:32:51

标签: mysql node.js express

我正在尝试使用NodeJS查询mySQL数据库,以检查是否存在行(如果要更新的话是否不创建行),但是却出现“无法设置未定义的属性'length'的错误”,不确定为什么请协助。下面是我的代码

const latitude = req.body.latitude;
const longitude = req.body.longitude;
const user_email = req.body.user_email;

  db.query('SELECT * FROM location WHERE user_email =?', [user_email], 
  (error, results, fields)=>{
    if (error) {
      console.error(error.message);
      res.send("success");
    } else if(results && results.length == 0){
      db.query('INSERT INTO location(latitude, longitude, user_email) VALUES("'+latitude+'", "'+longitude+'", "'+user_email+'")',
                   [latitude, longitude, user_email]);
      res.send("success");
    }else{
      db.query('UPDATE location SET latitude = ? , longitude = ?, WHERE user_email = ? '[latitude, longitude,user_email]);
      res.send("success");
    }
  }

2 个答案:

答案 0 :(得分:2)

建议的更改:

  db.query(
   'SELECT * FROM location WHERE user_email =?',[user_email],  
   (error, results, fields)=>{
     if (error) {
       console.error(error.message);
       res.send("success");
     } else if (results && results.length == 0){
       db.query(
          'INSERT INTO location(latitude, longitude, user_email)
        VALUES("'+latitude+'", "'+longitude+'", "'+user_email+'")',
          [latitude, longitude, user_email]);
      res.send("success");
    }else{
    ...

注意:

  1. 检查错误。始终检查错误:)

  2. 我相信[user_mail]前应该有逗号

  3. 在尝试引用结果之前检查“结果”是否为null。长度

  4. 在Java语言中,“ ==”表示“检查是否相等”,而“ =“ =”表示“分配给变量”。

答案 1 :(得分:0)

这里的一个选择是利用MySQL的ON DUPLICATE KEY功能。假设您在user_email列上具有唯一索引,则可以尝试以下语法:

INSERT INTO location (latitude, longitude, user_email)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE latitude = ?, longitude = ?;

这仅需要在Node中进行单个查询:

db.query('INSERT INTO location (latitude, longitude, user_email) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE latitude = ?, longitude = ?',
    [latitude, longitude, user_email, latitude, longitude]);
res.send("success");

首先执行选择并根据是否要插入该选择来做出决定的主要潜在问题是,可能在这两个命令之间插入了另一个进程。也就是说,除非您使用某种类型的事务来确保选择和更新是原子发生的,否则代码的当前方法仍然可能会导致插入重复的记录。使用ON DUPLICATE KEY将此责任放在数据库上。