Я пытаюсь сохранить некоторые данные в своей коллекции, используя mongoose.
//tried with async each
async.each(indexes, function(index, callback) {
newChampion.ID = champions[index].id;
newChampion.Key = champions[index].key;
newChampion.Name = champions[index].name;
newChampion.Title = champions[index].title;
Champion.addChampion(newChampion, function(err) {
if (err) {
console.log(err.message);
callback();
} else {
callback();
}
});
Проблема в том, что он толкает меня только значение, соответствующее последнему индексу (из 133 значений). У меня уникальный идентификатор, поэтому в базе данных сохраняется только одно значение. Я поместил console.log в функцию addChampion, и в 133 раза я вижу одно и то же значение. Добавьте нижеприведенный фрагмент:
module.exports.addChampion = function(newChampion, callback) {
newChampion.save(callback);
}
Как я решаю эту проблему, чтобы все 133 значения были введены в БД?
Асинхронное задание с моим локальным mysql:
let async = require('async');
let mysql = require('mysql');
var conn = mysql.createConnection({
host: 'localhost',
user: 'root',
password: 'xxxxx',
database: 'xxxxx',
port: 3306
});
var sqls = [
'select id from record where id = 1',
'select id from record where id = 2',
'select id from record where id = 3',
'select id from record where id = 4',
'select id from record where id = 5'
];
async.each(sqls, function(sql, callback) {
console.log(sql);
conn.query(sql, function (err, res) {
console.log(res);
});
});
### output ###
select id from record where id = 1
select id from record where id = 2
select id from record where id = 3
select id from record where id = 4
select id from record where id = 5
[ RowDataPacket { id: 1 } ]
[ RowDataPacket { id: 2 } ]
[ RowDataPacket { id: 3 } ]
[ RowDataPacket { id: 4 } ]
[ RowDataPacket { id: 5 } ]
Простой случай с не очень асинхронной работой:
let async = require('async');
let addChampion = function(newChampion, callback) {
console.log(newChampion)
}
indexes = [1, 2, 3];
async.each(indexes, function(index, callback) {
newChampion = {};
newChampion.ID = index;
addChampion(newChampion, function(err) {
if (err) {
console.log(err.message);
}
})
});
### output ###
{ ID: 1 }
{ ID: 2 }
{ ID: 3 }
Вы проверили бы свой newChampion
прежде чем переходить в функцию addChampion
? Это действительно связано с тем же индексом на консоли.
newChampion
используется для каждой записи в indexes
. Если each
функция выполняется для всех записей в indexes
до того, как addChampion
получит обновить базу данных, все обновления будут выполняться для последней обработанной записи индекса.
newChampion
а создать 133 из них в цикле ...