2017-09-04 3 views
1

Ich habe eine Funktion in meinem Sails 1.0-Anwendung, die einen neuen Benutzer mit dem MongoDB fügt und dann am Ende zurückkehren soll das User-Objekt als JSON zurückgeben ...Sails.JS - Erstellt Benutzer wont Benutzerobjekt

Die Der Benutzer wird zur Sammlung hinzugefügt, aber beim Versuch, die _id des neuen Benutzerobjekts abzurufen, wird ein Fehler ausgegeben. Wenn ich versuche, console.log() zu erstellen, kommt der createdUser als Undefined zurück. Versuchen Sie herauszufinden, wie der Benutzer in Mongo erstellt werden kann, aber nicht als Objekt in derselben Funktion zurückgegeben wird?

kurz im Register() Funktion führt Folgendes aus:

  • Dieser Test prüft einige Eingänge
  • Checks für gültige E-Mail-Adresse
  • Passwort Verschlüsselt
  • Findet Gravatar URL ggf.
  • Einsätze Benutzer in Sammlung
  • Setzen Sie user._id in req.session (FEHLER BEFINDET SICH HIER)
  • Return User-Objekt als JSON

Fehler:

info: ·• Auto-migrating... (alter) 
info: Hold tight, this could take a moment. 
info: ✓ Auto-migration complete. 

warn: Ignored attempt to bind route (/resend-username) to unknown action :: UserController.resendUsername 
info: 
info:    .-..-. 
info: 
info: Sails    <| .-..-. 
info: v1.0.0-37   |\ 
info:      /|.\ 
info:     /|| \ 
info:     ,' |' \ 
info:     .-'.-==|/_--' 
info:     `--'-------' 
info: __---___--___---___--___---___--___ 
info: ____---___--___---___--___---___--___-__ 
info: 
info: Server lifted in `D:\Development\Sails\goknack-sails-1.0` 
info: To shut down Sails, press <CTRL> + C at any time. 

debug: ------------------------------------------------------- 
debug: :: Tue Sep 05 2017 18:08:33 GMT-0500 (Central Daylight Time) 

debug: Environment : development 
debug: Port  : 1337 
debug: ------------------------------------------------------- 
undefined 
D:\Development\Sails\goknack-sails-1.0\node_modules\mongodb\lib\utils.js:123 
    process.nextTick(function() { throw err; }); 
           ^

TypeError: Cannot read property '_id' of undefined 
    at D:\Development\Sails\goknack-sails-1.0\api\controllers\UserController.js:259:47 
    at D:\Development\Sails\goknack-sails-1.0\node_modules\parley\lib\private\Deferred.js:232:16 
    at _afterTalkingToAdapter (D:\Development\Sails\goknack-sails-1.0\node_modules\waterline\lib\waterline\methods\create.js:282:22) 
    at D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\lib\private\do-with-connection.js:223:16 
    at D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\lib\private\do-with-connection.js:123:18 
    at Object.success (D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\lib\private\build-std-adapter-method.js:61:47) 
    at afterMaybeArtificiallyWaiting (D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\node_modules\machine\lib\private\intercept-exit-callbacks.js:406:21) 
    at maybeArtificiallyWait (D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\node_modules\machine\lib\private\intercept-exit-callbacks.js:220:20) 
    at afterPotentiallyCaching (D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\node_modules\machine\lib\private\intercept-exit-callbacks.js:240:11) 
    at _cacheIfAppropriate (D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\node_modules\machine\lib\private\intercept-exit-callbacks.js:98:18) 
    at Function._interceptExit [as success] (D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\node_modules\machine\lib\private\intercept-exit-callbacks.js:111:9) 
    at D:\Development\Sails\goknack-sails-1.0\node_modules\sails-mongo\lib\private\machines\create-record.js:99:22 
    at D:\Development\Sails\goknack-sails-1.0\node_modules\mongodb\lib\collection.js:437:18 
    at handleCallback (D:\Development\Sails\goknack-sails-1.0\node_modules\mongodb\lib\utils.js:120:56) 
    at D:\Development\Sails\goknack-sails-1.0\node_modules\mongodb\lib\collection.js:743:5 
    at D:\Development\Sails\goknack-sails-1.0\node_modules\mongodb-core\lib\connection\pool.js:461:18 
          ^

ich versucht habe ID _id Schalt da es Mongo ist aber kein Glück, wenn ich versuche, createdUser zu console.log es ist nicht definiert .

Der Datensatz wird in der Datenbank erstellt ... Jede Hilfe auf, wo ich vielleicht vermasseln würde geschätzt werden.

enter image description here

Die volle Register Funktion Ich verwende:

register: function (req, res) { 

    if (_.isUndefined(req.param('first'))) { 
     return res.badRequest('A first name is required!'); 
    } 

    if (_.isUndefined(req.param('last'))) { 
     return res.badRequest('A last name is required!'); 
    } 

    if (_.isUndefined(req.param('phone'))) { 
     return res.badRequest('A phone number is required!'); 
    } 

    if (_.isUndefined(req.param('email'))) { 
     return res.badRequest('An email address is required!'); 
    } 

    if (req.param('email') !== req.param('emailConfirm')) { 
     return res.badRequest('Email addresses do not match!'); 
    } 

    if (_.isUndefined(req.param('password'))) { 
     return res.badRequest('A password is required!'); 
    } 

    if (req.param('password').length < 6) { 
     return res.badRequest('Password must be at least 6 characters!'); 
    } 

    if (req.param('password') !== req.param('confirmPassword')) { 
     return res.badRequest('Passwords do not match!'); 
    } 

    if (_.isUndefined(req.param('tos'))) { 
     return res.badRequest('You must review and accept the Goknack Terms of Service & Privacy policy.'); 
    } 



    Emailaddresses.validate({ 
     string: req.param('email'), 
    }).exec({ 
     // An unexpected error occurred. 
     error: function (err) { 
     return res.serverError(err); 
     }, 
     // The provided string is not an email address. 
     invalid: function() { 
     return res.badRequest('Doesn\'t look like an email address to me!'); 
     }, 
     // OK. 
     success: function() { 

     Passwords.encryptPassword({ 
      password: req.param('password'), 
     }).exec({ 

      error: function (err) { 
      return res.serverError(err); 
      }, 

      success: function (result) { 

      var options = {}; 

      // gravitar image for user, if present 
      try { 

       options.gravatarURL = Gravatar.getImageUrl({ 
       emailAddress: req.param('email') 
       }).execSync(); 

      } catch (err) { 
       return res.serverError(err); 
      } 

      options.email = req.param('email'); 
      options.username = req.param('username'); 
      options.encryptedPassword = result; 
      options.deleted = false; 
      options.deletedDate = ''; 
      options.admin = false; 
      options.banned = false; 
      options.paypalEmail = ''; 


      // validate that email address has not been used before 
      User.find({email: req.param('email')}).exec(function(err, user) { 
       if (err) { 
       return res.negotiate(err); 
       } 

       if (user.length > 0) { 
       return res.badRequest('Invalid email, this email address is already in use.'); 
       } else { 
       // create new user 
       User.create(options).exec(function (err, createdUser) { 

        if (err) { 
        console.log('the error is: ', err.invalidAttributes); 
        return res.negotiate(err); 
        } 

        // Log the user in 
        console.log(createdUser); 
        req.session.userId = createdUser._id; 

        // NOTHING IS BEING RETURNED IN createdUser 

        return res.json(createdUser); 
       }); 

       } 
      }); 

      } 
     }); 
     } 
    }); 
    }, 
+0

Könnten Sie bitte Ihre Frage ein wenig nachschreiben, nachdem @arbuthnott das User.find() - Syntaxproblem gelöst hat. Ich fühle mich, als ob ich jetzt nicht dem Hauptgedanken Ihrer Frage folgen kann. Ich möchte dir helfen, dieses Ding zu lösen. Ich bin ein großer SailsJS-Unterstützer –

+0

Hi Zach, formulierte die Frage ein wenig um, um es deutlicher zu machen, was passiert, wenn ich versuche, einen neuen Benutzer zu erstellen und dann dieses Objekt zurückzugeben. Die Updates für die Methode find() wurden ebenfalls bereits angewendet. Sie werden sehen, am Ende der Register-Methode Ich versuche, die Benutzer-ID zu req.session.userId zusammen mit einer einfachen console.log() ohne Glück zu setzen. – xXPhenom22Xx

+0

Ein paar weitere Kommentare dazu, was die Register-Funktion macht, schätze die Hilfe – xXPhenom22Xx

Antwort

2

Das ist wirklich seltsam scheint. Aber ich sehe einen möglichen Täter ... wenn Sie nach E-Mail-Eindeutigkeit mit User.find() suchen, erkenne ich Ihre Verwendung von finden nicht. Sie nennen es wie:

User.find({email: req.param('email')}, function(err, user) { 
    //... 
}); 

Aber ich glaube nicht, find einen zweiten Eingang akzeptiert. Du meinst wahrscheinlich exec:

User.find({email: req.param('email')}).exec(function(err, user) { 
    //... 
}); 

Ich kann nicht die genaue Logik folgen, die auf Ihre spezifischen Fehler führt, aber wenn Sie ausführen irgendwie einen Funktionsparameter, die gemeint ist, nicht dort zu sein, Fixierung, die ein Ort ist, an Anfang.

+0

Schön, dass Sie Recht haben, nicht sicher, wie das funktionierte, aber ich reparierte den User.find-Aufruf, aber derselbe Fehler existiert leider. Ich habe den Stack-Trace über – xXPhenom22Xx

+0

hinzugefügt Hmm, drat. Ich bin sehr zuversichtlich, dass Ihre Verwendung von 'User.create' korrekt ist (und das Objekt tatsächlich in die db geht) und der fertige Datensatz soll definitiv im Callback vorhanden sein. Ich würde nach Fehlern suchen, die die Kette weiter unterstützen ... Ich bin mir nicht sicher, wie 'EmailAddresses.validate' oder' Passwords.encryptPassword' oder 'Gravitar' funktionieren - ich würde diese ein bisschen debuggen. Wenn möglich, entfernen Sie einige davon zum Testen und fügen Sie sie dann einzeln zurück. – arbuthnott

+0

Gute Idee, lassen Sie mich das einen Wirbel geben. – xXPhenom22Xx

0

Ich hatte das gleiche Problem. Ich versuchte dann findOrCreate, die den neuen Datensatz zurückgab. Ich denke, das ist ein Bug von Sails 1.0, da ich dieses Problem nie mit 0.12 hatte.

0

Meine Antwort ist spät, aber das könnte jemand in der Zukunft helfen. Diese Syntax:

User.find({email: req.param('email')}, function(err, user) { 
    //... 
}); 

ist die Syntax von Mike McNeil in dem Buch Sails.js in Aktion verwendet. Es funktioniert tatsächlich, zumindest in V0.12.Der einzige Grund, warum ich dieses Problem verursachen könnte, wo der Datensatz erstellt, aber nicht zurückgegeben wird, ist, wenn Sie Ihre eigene create() - Methode auf dem UserController erstellt haben und das Objekt nicht einmal zurückgeben erstellt.

0

Ich weiß nicht, ob jemand dies herausgefunden, ich habe mit Sails v1.0 das gleiche Problem für STUNDEN heute.

Schließlich gab ich auf und installiert v0.12, portierte meinen Controller und Modelle, und es funktionierte gut.

Dies muss ein Fehler in v1.0 sein, wo weder .exec (function (err, result) {...}) noch .then (function (result) {...}). Catch (function (err) {...}) gibt ein Objekt zurück!

kann ich bezeugen, dass die await/holen() -Methode Arbeit in v1.0 TUT, aber ich bin nicht sicher, wie mit Datei-Upload zu implementieren. So v0.12 bleibt es.