Vai al contenuto


Foto

[node.js] query sequenziali


Questa discussione e' stata archiviata Questo significa che non e' possibile rispondere
14 risposte a questa discussione

#1 thewebsurfer

thewebsurfer

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 6.907 Messaggi:

Inviato 03 febbraio 2016 - 19:34

salve, magari è uno sparo nel buio postare qui, ma per caso qualcuno scrive roba in node.js qui dentro (MEAN platform)?

Ho un problema che mi porto avanti da 3 giorni..

Se ricevo un ack espongo  :eeeh:


Non c'è più l'entropia di una volta


#2 matti157

matti157

    Schiavo

  • GRULLINO
  • 15.041 Messaggi:

Inviato 03 febbraio 2016 - 20:21

In b4 toyo
Cooler Master 690|Intel Core i7 920 @3.7Ghz|Gigabyte GTX 770 OC|12GB Corsair DDR3 1600|Noctua NH-U12P|Corsair TX550

 

 

Un giorno ho visto per strada un tizio barcollante , sporco, pieno di chiazze verdi e pus, infastidiva bambine e rubava i soldi alle vecchiette: era uno che postava nel DS.


ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้ก็็็็็็็็็็็็็็็็็็็็ กิิิิิิิิิิิิิิิิิิิิ ก้้้้้้้้้้้้้้้้้้้้


#3 thewebsurfer

thewebsurfer

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 6.907 Messaggi:

Inviato 04 febbraio 2016 - 01:14

vabbè scrivo nella speranza che qualcuno passi di qui.
Uso nodejs+express+mongoose+mongodb
Per la sincronizzazione sto tentando col modulo async
 
Quello che devo fare detto semplicemente:
ho 2 collezioni, "users" e "posts". Questi gli schemi di mongoose:

var com_user_schema = new Schema({
    name: { type: String, required: true },
    age: {type:Number, required:true}
});
var com_user= mongoose.model('com_user', com_user_schema);
var com_post_schema = new Schema({
    content: { type: String, required: true },
    postedBy: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'com_user'
    }]
});
var com_post= mongoose.model('com_post', com_post_schema);

Quindi un post può avere più di un autore. 
 
Questa è una richiesta json d'esempio

{
	"content": "testpost",
	"users": "john, alice",
	"postedBy": [{
		"_id": "56af765961e2949410d95663",
		"name": "john",
		"age": 200,
		"__v": 0,
		"value": "john",
		"label": "john"
	}, {
		"value": "alice",
		"label": "alice"
	}]
}

 
Questa la route interessata

app.post('/api/community/posts', function(req,res){

async.waterfall([
            function(callback) {
                req.body.postedBy.forEach(function(el){
                        com_user.findById(el._id,function(err,user){
                            if(user){
                                arr.push(el._id);
                                console.log('user found!')
                            }
                            else{
                                newusers.push(el.label)
                            }
                        });
                });

                callback(null);
            },
            function(newusers, arr, callback) {
                newusers.forEach(function(el){
                    var com_user1 = new com_user({
                        name: el.label,
                        age: 20
                    });
                    com_user1.save(function (err, newuser) {
                        if (err)
                            console.log(err)
                        else {
                            console.log('User not found and just added!');
                            console.log(newuser)
                            arr.push(mongoose.Types.ObjectId(newuser._id));
                        }
                    });
                });

                callback(null);
            }
        ], function(error) {
            console.log('finish!');
            console.log(arr);
             //dovrei salvare il post qui
            res.json({"finish! ":1});
        });

});

 
 
IL PROBLEMA:
in console vedo prima "finish!" e poi "user found" e "user not found", così l'array "arr" che dovrebbe contenere gli id degli utenti è vuoto.


dico solo  :whistler:  :whistler:  :whistler:


Non c'è più l'entropia di una volta


#4 yorkeiser

yorkeiser

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 68.618 Messaggi:

Inviato 04 febbraio 2016 - 10:41

javashit :fuckno:


Il sole è giallo

Brava Giovanna, brava

E canto please don't let me be misunderstood mentre parcheggio nel parcheggio l'alfasud


#5 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 19:39

javashit :fuckno:

:vabe:


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#6 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 19:44

scusa ma chiami la callback passando solo null


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#7 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 19:45

se è quello e l'ho visto io che

 

    ho solo lurkato 30 sec qui https://www.npmjs.co...async-waterfall, non l'avevo mai vista

 

    mai scritto niente in node js

 

    sono anche high as fuck  ora

 

sei proprio scarso


Messaggio modificato da toyo il 04 febbraio 2016 - 19:46

FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#8 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 20:03

app.post('/api/community/posts', function(req,res){

async.waterfall([
            function(callback) {
                req.body.postedBy.forEach(function(el){
                        com_user.findById(el._id,function(err,user){
                            if(user){
                                arr.push(el._id);
                                console.log('user found!')
                            }
                            else{
                                newusers.push(el.label)
                            }
                        });
                });

                callback(null, newusers, arr);
            },
            function(newusers, arr, callback) {
                newusers.forEach(function(el){
                    var com_user1 = new com_user({
                        name: el.label,
                        age: 20
                    });
                    com_user1.save(function (err, newuser) {
                        if (err)
                            console.log(err)
                        else {
                            console.log('User not found and just added!');
                            console.log(newuser)
                            arr.push(mongoose.Types.ObjectId(newuser._id));
                        }
                    });
                });

                callback(null);
            }
        ], function(error) {
            console.log('finish!');
            console.log(arr);
             //dovrei salvare il post qui
            res.json({"finish! ":1});
        });

});

così nella mia testa


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#9 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 20:04

ma che poi sti arr e newusers da dove arrivano

 

comunque bocciatissimo per il nome delle variabili


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#10 thewebsurfer

thewebsurfer

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 6.907 Messaggi:

Inviato 04 febbraio 2016 - 20:31

ma che poi sti arr e newusers da dove arrivano

 

comunque bocciatissimo per il nome delle variabili

 

su questo hai ragione, nel semplificare il codice ho dimenticato

var arr=[],
    newusers=[]

ma perdonami col tuo codice mi fai capire che non hai capito una minghia del problema.
Che sia newbie di node ci siamo, sono 4 giorni che lo studio.

Se hai riferimenti che chiariscono il cazzo di control flow di node e l'event loop posta pure.


Non c'è più l'entropia di una volta


#11 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 20:35

provo con ordine poi magari non ho capito un cazzo

 

- arr e newusers in che scope sono definite?
- se sono in uno scope esterno a quelle funzioni, perché li dichiari come parametri della seconda funzione?


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#12 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 20:36

ma non sono in uno scope esterno dai, li dichiarerai nella prima e poi li passi

 

o no


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#13 thewebsurfer

thewebsurfer

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStelletta
  • 6.907 Messaggi:

Inviato 04 febbraio 2016 - 20:44

ma non sono in uno scope esterno dai, li dichiarerai nella prima e poi li passi

 

o no

 

si ma non è quello il cazzo di problema, il problema è nelle callback che ho usato a cazzo e quindi continuo l'esecuzione della waterfall quando non dovrei (arrivo al 3o step prima di salvare nuovi utenti nel db).
 

Comunque il codice funzionante è questo, ma non è che abbia capito del tutto il perché di queste callback messe così. Se hai guide posta pure.

app.post('/api/community/posts', function(req,res){
    var arr=[];
  async.forEachOf(req.body.postedBy, function (user, key, callback) {
      findOrAdd(user, function(err, author) {
          arr.push(author._id);
          //perché callback qui?
          callback();
      });
    }, function (err) {
        if (err) console.error(err.message);
        console.log(arr)
      var com_post1= new com_post({
          content:req.body.content,
          postedBy:arr,
      });
      com_post1.save(function(err){
          if(!err)
              res.json({"New post added! ":req.body.content});
          else {
              res.json({"Error adding post":'error'});
              error(err)
          }
      });


    });
 
function findOrAdd(userToFind,callback){
    var newuser=null;
    var user=null;
    async.series([
            function(callback){

                com_user.findOne({_id: userToFind._id},
                    function(err,obj) {

                        if(obj) {
                            user=obj
                            callback(null, obj);
                        } else {
                            newuser=userToFind.label
                            callback(null);
                        }

                    });

            },
            function(callback){
                if(newuser){
                var com_user1 = new com_user({
                    name: newuser,
                    age: 20
                });
                com_user1.save(function (err, n) {
                    if (err)
                        console.log(err);
                    else {
                        user=n;
                        callback(null);
                    }
                });
                } else callback(null);
            }
        ],
        function(err, results){
            callback(null,user)

        });

}

 

 

 

provo con ordine poi magari non ho capito un cazzo

 
- arr e newusers in che scope sono definite?
- se sono in uno scope esterno a quelle funzioni, perché li dichiari come parametri della seconda funzione?

 

hai ragione quei cavolo di parametri ti hanno completamente dirottato :okay: 
facevano parte di un tentativo precedente di portarmi le variabili in giro nella waterfall.

Per riassumere il thread il più brevemente possibile: il cazzo di i/o asincrono di node mi ha rotto le palle 3 giorni.


Messaggio modificato da thewebsurfer il 04 febbraio 2016 - 20:57

Non c'è più l'entropia di una volta


#14 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 21:31

ah k capito


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici


#15 toyo

toyo

    sono triste

  • Donatori di sperma
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 43.974 Messaggi:

Inviato 04 febbraio 2016 - 21:52

//perché callback qui?

iterator(item, key, callback) - A function to apply to each item in obj. The key is the item's key, or index in the case of an array. The iterator is passed a callback(err) which must be called once it has completed. If no error has occurred, the callback should be run without arguments or with an explicit null argument.


FIRMA FOTTUTAMENTE EDITATA. IL FOTTUTO STAFF.
 

Mai più giorni felici