将Array的每个项添加到mysql db

时间:2016-12-03 14:51:18

标签: mysql node.js

我是Java Script的新手,并尝试编写一个小程序来将用户添加到数据库中。我的问题是,我的程序并没有添加每个用户。它会像列表中的用户一样频繁地添加最后一个用户。用户拥有2个以上的对象,所有对象都填充了所有字段。

    for(i = 0; i<users.length; i++)
{

    var user = users[i];
    console.log(user.lastonline)
    pool.getConnection(function(err, connection) {
            if (err) throw err;
    var quer = connection.query('INSERT INTO users SET `steamid` = '+ connection.escape(user.steamid)+', `name`='+connection.escape(user.name)+', `lastonline`='+connection.escape(user.lastonline)+' ON DUPLICATE KEY UPDATE  `name`='+connection.escape(user.name)+', `lastonline`='+connection.escape(user.lastonline)+'', function(err, result) {
    connection.release();
    });
    console.log(quer.sql);
    });
}

我尝试用很多不同的方式重写它,但大多数时候我得到这样的东西:

  

TypeError:无法读取属性&#39; steamid&#39;未定义的

    for(i = 0; i<users.length; i++)
{


    pool.getConnection(function(err, connection) {
        console.log(users[i]["steamid"]);
        if (err) throw err;
    var quer = connection.query('INSERT INTO users SET `steamid` = '+ connection.escape(users[i]["steamid"])+', `name`='+connection.escape(users[i].name)+', `lastonline`='+connection.escape(users[i].lastonline)+' ON DUPLICATE KEY UPDATE  `name`='+connection.escape(users[i].name)+', `lastonline`='+connection.escape(users[i].lastonline)+'', function(err, result) {
    connection.release();
    });
    console.log(quer.sql);
    });
}

修改

其他程序

var mysql = require('mysql');
var Promise = require("bluebird");
var pool  = mysql.createPool({
  connectionLimit : 10,
  host            : 'localhost',
  user            : 'zar',
  password        : 'qxLLPa06iEs2Bzsu',
  database        : 'zar',
  socketPath: '/var/run/mysqld/mysqld.sock'
});

pool.on('connection', function (connection) {
  console.log("connection made")
});
//my testing users
var users = [];
times = Date.now();
user1 = {steamid:012345678912345658,name:"user1",lastonline:times};
user2 = {steamid:012345678912345628,name:"user2",lastonline:times};
user3 = {steamid:012345678912345618,name:"user3",lastonline:times};
users.push(user1);
users.push(user2);
users.push(user3);

1 个答案:

答案 0 :(得分:0)

修改:已修复仅使用一个连接。

以前的版本为每个用户创建了一个新连接。

你应该使用Promises:

pool.getConnection((err, connection) => {
    if (err) {
      console.log(err);
      return;
    }
    var tasks = users.map((user) => {
        return new Promise((resolve, reject) => {
            if (err) {
                return reject(err);
            } 

            var quer = connection.query('INSERT INTO users SET `steamid` = ' + connection.escape(user.steamid) + ', `name`=' + connection.escape(user.name) + ', `lastonline`=' + connection.escape(user.lastonline) + ' ON DUPLICATE KEY UPDATE  `name`=' + connection.escape(users.name) + ', `lastonline`=' + connection.escape(users.lastonline) + '', function (err, result) {                
                if (err) {
                    return reject(err);
                }
                resolve(result);
            });            
        });
    });


    Promise.all(tasks)
    .then((results) => {
        // Array of results passed in resolve
        connection.release();
    })
    .catch((err) => {
      // All errors you reject are catched here      
    });
});    

这应该可以工作但是,你仍在并行执行所有查询,这对于数据库来说可能非常激进。

我建议您查看bluebird Promise.each以获得更好的结果。