У меня есть это в Монго:цикл внутри запроса
//fill QueryString
collection.find({"myID" : {$in:QueryString} },{}).toArray(function(err, Stuff) {
...
var flag = true;
for (var i=0; i<Stuff.length; i++) {
//if statements .. alter flag
// if Stuff[i].myField....
}
if (req.body.type == "myField") {
collection.update(
{ "my_id" : req.body.id },
{$set : { "myField" : req.body.fileid }},
function(err, result) {
....
}
, и я сделал это в PostgreSQL:
pg.connect(conString, function(err, client, done) {
if (err) return console.error('error fetching client from pool', err);
client.query("SELECT * FROM mytable WHERE my_id = ANY ($1::varchar[]) ",[QueryString], function(err,Stuff) {
var flag = true;
for (var i=0; i<Stuff.rows.length; i++) {
...
//if statements .. alter flag
if (typeof(Stuff.rows[i].myField) === 'undefined' || ((typeof(Stuff.rows[i].myField) !== 'undefined' && Stuff.rows[i].myField.length < 16))) {
if (req.body.my_ids[i] === req.body.id && req.body.type === "myField") {
}else{
flag = false;
}
}
debug('flag:'+flag);
}//end of for loop
if (req.body.type === "anotherField") {
client.query("UPDATE mytable SET anotherField ='req.body.fileid' WHERE my_id = 'req.body.id'", function(err, result) {
....
});//endof update
done();
});//end of first query
Но для цикла не работает, как ожидается, в Postgres. Я не уверен, как использовать цикл в запросе.
Проблема в том, что флаг i каждый цикл является ложным, но он должен быть правдой.
Использование ============== ========
dbPromise.tx(function (t) {
return t.any("SELECT * FROM mytable WHERE my_id = ANY ($1::varchar[]) ",[QueryString])
.then(function (Stuff) {
var flag = true;
for (var i = 0; i < Stuff.length; i++) {
...//if statements
if (typeof(Stuff[i].myField === ....)
...
} //end of for loop
var queries = Stuff.map(function (d) {
if (req.body.type === "myField") {
return t.none("UPDATE mytable SET myField ='req.body.fileid' WHERE my_id = 'req.body.id'")
debug("success: "+req.body.id);
res.send({ user : req.user, message : "SUCCESS", my_id : req.body.id});
} else if (req.body.type === "anotherField") {
....
}
});
return t.batch(queries);
})
})
.then(function (Stuff) {
//this is executed for every single update ,right?
console.log("Hurrah!");
})
.catch(function (error) {
console.log("ERROR:", error.message || error);
});
При таком подходе я все еще в своей первоначальной проблеме. Флаг является ложным вместо истинного (с учетом монго).
Наконец, я не уверен насчет Stuff.map(function (d)
, о d
. Вместо этого я использую myField
? И если у меня есть много полей, как я?
Он должен работать, как у вас есть. Я бы установил точку останова в строке 'var flag = true', чтобы убедиться, что вы возвращаете что-либо в Stuff, как ожидалось, или если что-то не так с вашим запросом. – Paul
@Paul: Хорошо, слышу, что для циклов используются как this.I обновил мой код. Проблема в том, что флаг i каждый цикл является ложным, но он должен быть true.I есть другой запрос также (внутри первого). Я не уверен, что это проблема? Я использую 'done()' только при завершении первого запроса. Спасибо. – George
@George, вы должны использовать 'done' после завершения всех запросов. –