2016-06-27 16 views
2
postRegistrationHandler: function (account, req, res, next) { 
    console.log('postRegistrationHandler activated'); 
    account.getCustomData(function(err, data) { 
     if (err) { 
     console.log(err.toString, "error string"); 
     return next(err); 
     } else { 
     data.mongo_id = userCreationCtrl(account); 
     data.save(); 
     next(); 
     } 
    }); 
    }, 

Diese Funktion fast richtig funktioniert, aber die Zeile:NodeJS ist asynchron und mein Code nicht in der Reihenfolge ausgeführt, erwarte ich

 data.save(); 

läuft, bevor die vorhergehende Zeile endet, was bedeutet, dass die Daten Ich möchte sparen ist nicht zur richtigen Zeit vorhanden.

 data.mongo_id = userCreationCtrl(account); 

Diese Zeile ruft eine Funktion, die ein mongoDB Dokument mit Informationen auf dem Konto-Objekt erstellt zurückkehrt und dann die _id (das ist, was ich zu retten versuchen.

ich eine .then vielleicht dachte mit () würde helfen, aber das scheint aus irgendeinem Grund nicht verfügbar, hier zu sein Wenn jemand etwas sieht mir persönlich fehlt, die sehr hilfreich sein würde Danke

hier ist die userCreationCtrl Datei wie gewünscht..!

var UserSchema = require('./../models/UserModel.js'); 

var createNewUser = function (account, res, next){ 
    // We will return mongoId after it is created by submitting a newUser 
    var mongoId = ""; 
    // Save StormpathID (last 22 characters of account.href property) 
    var newStormpathId = account.href.slice(account.href.length - 22); 
    console.log('stormpath ID:', newStormpathId, 'just registered!'); 
    console.log(account); 
    // Create new user from model by recycling info from the Stormpath registration form and include the stormpathId as well. 
    var newUser = new UserSchema({ 
     stormpathId: newStormpathId, 
     firstName: account.givenName, 
     lastName: account.surname, 
     email: account.email, 
     street: account.street, 
     city: account.city, 
     zip: account.zip 
    }); 
    // This saves the user we just created in MongoDB 
    newUser.save(function(err, result){ 
     console.log(result); 
     if (err) { 
      console.error(err); 
     } 
     else { 
     console.log("User created in MongoDB, attempting to return mongoDB _id to stormpath customData"); 
     // Keep track of the new user's mongo _id so we can return it to the previous function and save it as Stormpath custom data. 
     mongoId = result._id; 
     console.log(mongoId, "mongoid"); 
     return result._id; 
     } 
    }); 
}; 

module.exports = createNewUser; 
+1

Können Sie nach der Inhalt der 'userCreationCtrl' Funktion? –

+0

Ja, ich habe es in die ursprüngliche Frage bearbeitet. –

+1

'userCreationCtrl' benötigt 3 Argumente und Sie übergeben nur 1. Anstatt von ihr' result._id' zurückzugeben, rufen Sie einfach Callback mit diesem Ergebnis auf und auch innerhalb dieses Callback-Aufrufs 'data.save()' –

Antwort

2

Sie haben userCreationCtrl erwartet 3 Argumente, account, res und next. next ist der Rückruf, der aufgerufen werden soll, nachdem der Benutzer so erstellt wird, statt return result._id Sie als nächstes so nennen sollte:

// inside of createNewUser() 
newUser.save(function(err, result){ 
    console.log(result); 
    if (err) { 
    console.error(err); 
    } 
    else { 
    console.log("User created in MongoDB, attempting to return mongoDB _id to stormpath customData"); 
    // Keep track of the new user's mongo _id so we can return it to the previous function and save it as Stormpath custom data. 
    mongoId = result._id; 
    console.log(mongoId, "mongoid"); 

    // IMPORTANT change to make it all work... 
    // get rid of return result._id because its not doing anything 
    // pass the value to your callback function instead of returning the value 
    next(null, result._id); 
    } 
}); 

dann in postRegistrationHandler sollte Aufruf Code wie folgt aussehen:

account.getCustomData(function(err, data) { 
    if (err) { 
    console.log(err.toString, "error string"); 
    return next(err); 
    } else { 
    // pass in a callback as the 3rd parameter that will be called by newUser.save() when its finished 
    userCreationCtrl(account, null, function(err, resultId) { 
     data.save(); 
     next(); 
    }); 
    } 
}); 
+1

Das ist alles gut und schön, aber wenn 'userCreateCtrl()' ist tatsächlich 'createNewUser()' in den Code der OP gepostet, dann 'createNewUser()' verwendet keinen Rückruf zu kommunizieren, wenn es fertig ist, so ist dies nur ein Stück was getan werden muss. – jfriend00

+0

das ist, was meine erste Zeile des Codes bezieht sich auf ... replace 'return result._id;' mit 'next (null, result._id);' – Ryan

+0

userCreateCrtl() ist in der Tat createNewUser() Ich könnte sie wahrscheinlich benannt haben das gleiche für Klarheit ... –