我是Node.js和“异步登陆”的新手,遇到了一些奇怪的问题。
来自MySQL的Node.js查询
来自Node.js的行查询得到了部分重复的列。
e.g。这是通过直接查找MySQL的结果,请注意userId
:
user1
以36
结尾,user2
以37
结尾
这是Node.js的输出
我有user1
和user2
与userId
相同,但其他列也是正确的。
我使用以下内容创建了表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的查询:
使用Node.js查询:
在此测试之后,我认为问题可能来自JSON无法正确处理的Big Int
。因此,我使用json-bigint切换了所有输出,但问题仍未得到解决:
答案 0 :(得分:0)
Bigint-s永远是Javascript的痛苦。你可以试着破解它,但为什么要这么麻烦?
两种可能的解决方案:
1)使用不超过Javascript中编码的阈值的较小整数,或
2)使用其他一些数据类型,例如string。
答案 1 :(得分:0)
正如其他人所指出的那样,整数的大小是问题所在。以下是一些需要考虑的内容:
Number.MAX_SAFE_INTEGER
的值 - 您将看到它小于您的userIds的值。特定值是由于Javascript的内部浮点表示的限制 - 超出一定的大小,整数变得不可能精确表达。答案 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