【问题标题】:INSERT INTO fails with node-mysql - variable is always NULLINSERT INTO 因 node-mysql 失败 - 变量始终为 NULL
【发布时间】:2016-01-19 15:47:37
【问题描述】:

我正在将 MySql 与 node.js 一起使用

我有这个查询,但它不起作用,MySQL 中的 temp1 始终为 NULL:

var queryTemp1 = { tid: '1', temp: temp1, timestamp: myDate };
con.query('INSERT INTO temps SET ?', queryTemp1, function(err,res){
  if(err) throw err;

  console.log('Last insert ID:', res.insertId);

});

我认为 temp1 是浮动的--我可以打印它并且一切正常:

var temp1 = parseFloat(stdout);
var temp1 = temp1/1000
var temp1 = (temp1.toFixed(2));

我的表有列:

+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| tid       | smallint(6) | YES  |     | NULL    |       |
| timestamp | datetime    | YES  |     | NULL    |       |
| temp      | float(4,2)  | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

我做错了什么?

【问题讨论】:

  • 你不能只是set 1。设置 WHICH 字段?
  • NULL 在临时字段中
  • 那么你需要set temp=?。你不能只设置一个值。值已经“设置”了。

标签: mysql node.js sql-insert node-mysql


【解决方案1】:

tid 当前是一个字符串,它正在寻找一个tinyint,尝试去掉单引号,看看是否会触发。

还要确保您的日期时间是一个日期时间而不是实际上的时间戳,例如 2014-01-01 00:00:00 而不是 1231232131

编辑:您的代码可能正在清除值,

var temp1 = parseFloat(stdout);
var temp1 = temp1/1000
var temp1 = (temp1.toFixed(2));

如果您需要更新 temp1,请取出 var

var temp1 = parseFloat(stdout);
temp1 = temp1/1000
temp1 = (temp1.toFixed(2));

【讨论】:

  • 我试过不加引号,没有任何变化。时间戳确实是日期时间 - 它工作得很好,并将日期存储在 MySQL 中
  • 您能否检查一下 tid 是否实际上也不是主键。
  • 此表中没有主键。
  • 我改变了,但没有帮助
  • 你能给我们举个例子temp1echo/console.log()吗?
【解决方案2】:

那个 INSERT 语句看起来不对...

试试这个:

// BIND PARAMS
var queryTemp1 = { tid: '1'
                 , temp: temp1
                 , timestamp: myDate 
                 };

// VARIABLE FOR SQL
var sql = "INSERT INTO temps(tid, temp, timestamp)\
           VALUES (:tid, :temp, :timestamp)";

// DATABASE
con.query( sql
         , queryTemp1
         , function(err, res) {
             if(err) throw err;
             console.log('Last insert ID:', res.insertId);
          });

【讨论】:

  • 我想插入所有值,并且提供的分辨率就像只想插入温度一样。
  • 查看 MySQL 文档 - 看起来您确实可以使用 INSERT SET dev.mysql.com/doc/refman/5.6/en/insert.html 。我从来没用过!无论如何 - 我不确定它是否适合绑定变量。看看我的回答是否对您有帮助,如果您需要更多帮助,请随时给我留言。
  • 结果是:var sql = "INSERT INTO temps(tid, temp, timestamp) ^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^ SyntaxError: Unexpected token ILLEGAL
  • 反斜杠后可能会有一个或多个空格 - 只需检查或将其全部放在一行上 - 例如var sql = "INSERT INTO temps(tid, temp, timestamp) VALUES (:tid, :temp, :timestamp)";
  • 我发现了,还是报错: throw err; ^ 错误:ER_PARSE_ERROR:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ':tid, :temp, :timestamp)' 附近使用正确的语法
【解决方案3】:

这是完整的代码:

    var mysql = require("mysql");
    var child_process = require('child_process');
    var temp1;
    // First you need to create a connection to the db
    var con = mysql.createConnection({
      host: "localhost",
      user: "user",
      password: "password",
      database: "database"
    });

    con.connect(function(err){
      if(err){
        console.log('Error connecting to Db');
        return;
      }
      console.log('Connection established');
    });

    console.log(temp1);

    child_process.exec("sudo -u www-data grep -a 't=' /var/www/temp/w1_slave | cut -f2 -d=", function (err, stdout, stderr){
        if (err) {
            console.log("child processes failed with error code: " +
                err.code);
        }
        console.log(stdout);
        temp1 = parseFloat(stdout);
        temp1 = temp1/1000
        temp1 = (temp1.toFixed(2));
    });



    var moment = require('moment');
    var now = moment();
    myDate =  moment(now.format('YYYY/MM/DD HH:mm:ss')).format("YYYY-MM-DD HH:mm:ss");

    var queryTemp1 = [1, temp1];

    // VARIABLE FOR SQL
    var sql = "INSERT INTO temps(tid, temp) VALUES (?)";

    // DATABASE
    con.query(sql
             , queryTemp1
             , function(err, res) {
                 if(err){console.log(queryTemp1); throw err;}
                 console.log('Last insert ID:', res.insertId);
              });
    console.log(queryTemp1);

【讨论】:

  • 用 SET 替换 VALUES - 如果你想使用 VALUES,那么你需要规定它们是什么(如我的回答所示)
【解决方案4】:

我的用例的一个工作示例,它插入一行并返回 insertId

函数定义:

const sleep = (waitTimeInMs) => new Promise(resolve => setTimeout(resolve, waitTimeInMs));
const insertLog = async (db, requestUrl, requestType, isRequestSuccessful) => {
    let insertId = null;

    const stmt = 'insert into logs(request_url, request_type, request_status) values (?, ?, ?)';
    const insertData = [requestUrl, requestType, isRequestSuccessful ? 'successful' : 'failed'];
    db.query(stmt, insertData, (err, result, fields) => {
        if (err) {
            throw err;
        }

        insertId = result.insertId;
    });

    while(insertId === null) {
        await sleep(100);
    }

    return insertId;
};

用法:

const logId = await insertLog(mysqlConnection, browseUrl, 'browse', false);

我正在使用 mysql 包 v2.18.1 和节点 v15.4.0。

应该很容易适应您的用例,例如

const insertId = await insert(mysqlConnection, data);

【讨论】:

    猜你喜欢
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 2019-12-19
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    相关资源
    最近更新 更多