mysql - 将数组的每个项目添加到 mysql 数据库

标签 mysql node.js

我对 Java 脚本还很陌生,并尝试编写一个小程序来将用户添加到数据库。我的问题是,我的程序没有添加每个用户的程序。它添加最后一个用户的频率与列表中用户的数量一样多。用户拥有超过 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: Cannot read property 'steamid' of undefined

    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);

最佳答案

编辑:修复为仅使用一个连接。

以前的版本为每个用户获取一个新连接。

你应该使用 Promise:

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以获得更好的结果。

关于mysql - 将数组的每个项目添加到 mysql 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40949034/

相关文章:

javascript - 使用 V8/node.js 创建一个空的 PixelArray

php - 多图片上传无法将描述保存到数据库中。如何解决这个问题?

MySQL 按所选表的数组值排序

php - 如何使用 PHP 将 XML 字符串中的值正确插入到 mysql 中?

node.js - react js : Rendering multiple index html in a single page applications

node.js - 如何在 typescript 中引用@types/module?

mysql - 避免在 Node js 中的 SQL LIKE 查询中注入(inject)

mysql - 如何获取仅在特定时间段内购买商品的用户(MySQL 数据库)

php - CodeIgniter 两个表Left Join在右表缺失时不返回左表的Join Condition id

javascript - 具有可破坏障碍物的星