2017-09-04 64 views
1

我在我的帆函数1.0的应用程序,添加一个新用户到MongoDB的,然后在年底应该返回用户对象作为JSON ...Sails.JS - 创建用户不会返回用户对象

的用户确实已添加到集合中,但在尝试获取新用户对象的_id时会引发错误。当我尝试console.log()createdUser时,它返回为Undefined。试图弄清楚用户如何在Mongo中创建,但不能作为同一个函数中的对象返回?

总之寄存器()函数执行以下操作:

  • 验证某些输入
  • 检查是否有有效的电子邮件地址
  • 对密码进行加密
  • 查找的Gravatar URL(如果适用)
  • 插入用户收集
  • 在req.session中设置user._id(错误在此发生)
  • 返回用户对象作为JSON

错误:

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 
          ^

我曾尝试切换ID来_id,因为它是蒙戈,但没有运气,当我尝试CONSOLE.LOG createdUser它是未定义。

该记录正在数据库中创建...任何帮助,我可能会搞砸了,将不胜感激。

enter image description here

完整的注册功能,我使用:

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

您可以在@arbuthnott清除User.find()语法问题之后重新编写您的问题。我觉得我现在不能遵循你的问题的主要依据。想帮助你解决这个问题。我是一个很大的SailsJS支持者 –

+0

Hi Zach,重新修改了这个问题,使我更清楚当我尝试创建一个新用户然后返回该对象时发生了什么。 find()方法的更新也已经被应用。 你会看到在注册方法的最后,我试图设置用户ID req.session.userId与一个简单的console.log()没有运气。 – xXPhenom22Xx

+0

添加了一些关于注册功能的更多评论,欣赏帮助 – xXPhenom22Xx

回答

2

这似乎真的很奇怪。但我看到一个可能的罪魁祸首......当您使用User.find()检查电子邮件唯一性时,我不认识您使用find。你这样称呼它:

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

但我不认为find接受第二个输入。你大概的意思exec

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

我跟不上,导致您的特定错误的确切逻辑,但如果你以某种方式执行函数参数并不意味着在那里,固定是一个地方开始。

+0

好的,你是对的,不知道如何工作,但我修复了User.find调用,但不幸的是存在相同的错误。我在 – xXPhenom22Xx

+0

以上添加了堆栈跟踪嗯,drat。我确信你对'User.create'的使用是正确的(并且对象实际上在db中)并且完成的记录绝对应该在回调中存在。我会查找错误进一步备份链......我不确定EmailAddresses.validate或Passwords.encryptPassword或Gravitar是如何工作的 - 我会调试那些。如果可能的话,将其中一些用于测试,然后逐个添加回来。 – arbuthnott

+0

好主意,让我给你一个旋风。 – xXPhenom22Xx

0

我有同样的问题。然后我尝试了findOrCreate,它返回了新的记录。我认为这是Sails 1.0的一个bug,因为我从来没有在0.12版本中遇到这个问题。

0

我的回答很晚,但这对未来可能有帮助。这句法:

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

是在行动书中Sails.js使用麦克麦克尼尔的语法。它至少在V0.12中确实有效。

关于这个错误,我可以想到导致这个问题的唯一原因,即创建记录但没有返回的原因是,如果您在UserController上创建了自己的create()方法,并且您没有返回该对象创建。

0

我不知道是否有人想通了这一点,我一直有与帆V1.0今天HOURS同样的问题。

我终于放弃并安装了v0.12,移植了我的控制器和模型,并且它工作正常。

这必须是v1.0中的一个bug,其中.exec(function(err,result){...})和.then(function(result){...})。catch(function(err ){...})返回一个对象!

我可以证明await/fetch()方法在v1.0中工作,但我不确定如何使用文件上载来实现。所以v0.12它仍然存在。