Sails.JS – 创build的用户不会返回用户对象

我在我的Sails 1.0应用程序中添加了一个新的用户MongoDB的function,然后在最后应该返回用户对象作为JSON …

用户确实被添加到集合中,但是在尝试获取新的用户对象的_id时会引发错误。 当我尝试console.log()createdUser它回来作为未定义。 试图找出用户如何在Mongo中创build,但不能作为一个对象在同一个函数中返回?

简而言之,Register()函数执行以下操作:

  • validation一些input
  • 检查有效的电子邮件地址
  • encryption密码
  • 查找Gravatar URL(如果适用)
  • 将用户插入到collections中
  • 在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,因为它是Mongo,但没有运气,当我尝试console.log createdUser它是未定义的。

logging正在数据库中创build…任何帮助,我可能会搞砸了,将不胜感激。

在这里输入图像说明

我正在使用的完整的注册function:

  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); }); } }); } }); } }); }, 

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

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

但我不认为find接受第二个input。 你可能是指exec

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

我不能遵循导致你的具体错误的确切的逻辑,但是如果你以某种方式执行一个函数参数,并不意味着在那里,修复这是一个开始的地方。

从sails 1.0开始,你需要指定你想从create调用中返回这个模型。 为了做到这一点你create一个fetch调用。

 let createdUser = await User.create({ name: "Some name" }).fetch(); 

此外, await现在比callback更受欢迎。

更多关于这里: https : //next.sailsjs.com/documentation/reference/waterline-orm/models/create

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

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

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

是迈克·麦克尼尔(Michael McNeil)在Sails.js一书中使用的语法。 它实际上工作,至less在V0.12。

关于这个错误,我可以想到导致这个问题的唯一原因,那就是创buildlogging的时候,如果你在UserController上创build了你自己的create()方法,并且你没有返回创build的对象。