Node.js从MySQL返回部分重复的行

时间:2014-05-31 22:33:00

标签: mysql node.js

我是Node.js和“异步登陆”的新手,遇到了一些奇怪的问题。

我打算做的事情:

来自MySQL的Node.js查询

问题是什么:

来自Node.js的行查询得到了部分重复的列。

e.g。这是通过直接查找MySQL的结果,请注意userId

user136结尾,user237结尾

enter image description here

这是Node.js的输出

enter image description here

我有user1user2userId相同,但其他列也是正确的。

代码:

我使用以下内容创建了表userInfo

create table userInfo(userId bigint, userName text, userEmail text, userNetwork text, userAvatar blob);

并使用以下命令填充:

insert into userInfo values(uuid_short(), 'user1', 'user@test.com', 'facebook', null);
insert into userInfo values(uuid_short(), 'user2', 'user2@test.com', 'facebook', null);

我正在使用的Node.js代码:

var http = require("http"), 
// And url module, which is very helpful in parsing request parameters. 
    url = require("url"),
    // add sql module
    mysql = require("mysql");

var connection = mysql.createConnection({
    host: 'localhost',
    user: "root",
    password: "xxxxxx",
    database: "db"
})
// show message at console
console.log('Node.js server is running.'); 
// Create the server. 
http.createServer(function (request, response) { 
    request.resume();
    // Attach listener on end event. 
    request.on("end", function () {
        // Parse the request for arguments and store them in _get variable. 
        // This function parses the url from request and returns object representation. 
        var _get = url.parse(request.url, true).query; 
        // query the database
        connection.connect();
        var getInfo = _get['getInfo'];
        var qString = new Buffer(getInfo, 'base64').toString('utf8');
            console.log(qString);
        connection.query(qString, function (error, rows, fields) {
                if (error) {
                    throw error;
                }
        if (rows.length > 0) {
                // send the data as json
                console.log(JSON.stringify(rows));
                response.end(JSON.stringify(rows));
            } else {
                // send code 200 json as there are no rows
                response.end(JSON.stringify({code:200}));
            }
        });
    });
}).listen(8080);

即使我已经替换了这个

,这个问题仍然存在

connection.query(qString, function (error, rows, fields)

connection.query('SELECT * FROM userId', function (error, rows, fields)

你能告诉我哪里出错了吗?

我想问题是我不能很好地应对异步?

更新

我在另一台机器(Windows机器)上尝试了相同的SQL和代码,结果是相同的,其他所有列都正确,但是userId

来自MySQL的查询:

enter image description here

使用Node.js查询:

enter image description here

在此测试之后,我认为问题可能来自JSON无法正确处理的Big Int。因此,我使用json-bigint切换了所有输出,但问题仍未得到解决:

enter image description here

4 个答案:

答案 0 :(得分:0)

Bigint-s永远是Javascript的痛苦。你可以试着破解它,但为什么要这么麻烦?

两种可能的解决方案:

1)使用不超过Javascript中编码的阈值的较小整数,或

2)使用其他一些数据类型,例如string。

答案 1 :(得分:0)

正如其他人所指出的那样,整数的大小是问题所在。以下是一些需要考虑的内容:

  • 一些简短的谷歌搜索表明他们正在努力在ES6中对此进行标准化。
  • 要查看可在Chrome中使用的最大整数,请打开控制台并输出Number.MAX_SAFE_INTEGER的值 - 您将看到它小于您的userIds的值。特定值是由于Javascript的内部浮点表示的限制 - 超出一定的大小,整数变得不可能精确表达。
  • 此处了解详情的a blog post

答案 2 :(得分:0)

bigNumberStrings驱动程序connection option设置为true,这样就可以将大数字作为字符串序列化为结果:

var connection = mysql.createConnection({
    host: 'localhost',
    user: "root",
    password: "xxxxxx",
    database: "db",
    supportBigNumbers: true,
    bigNumberStrings: true       
})

答案 3 :(得分:0)

var mysql = require('mysql');

var con = mysql.createConnection({
  host: "localhost",
  user: "",
  password: "",
  database: ""
});

con.connect(function(err) {
  if (err) throw err;
  console.log("Connected!");
  var sql = "INSERT INTO studentdetails(fname,lname,age,dob,streetname,city,state,pincode) VALUES ('aaa','bbb',22,'1994-05-13','PC','MTM','qqqq',1242352)";
  **con.query(sql, function (err,rows,result) {
    if (err) throw err;


          if (rows.fname === sql.fname) {
             console.log('Already exist');

               }
               else {
                 console.log("1 record inserted");
               }** 
                con.end();
   });

  });




// is this correct to ignore the duplicate values??
suggest me an answer please