2017-12-23 5 views
-1

私はLaravelから来るNodeJSを学んでいます。私は、Feathersジェネレータが提供するフックでユーザー登録の基本的な検証をセットアップしました。メールアドレスが存在するかどうかを確認するにはどうすればよいですか?

ユーザサービスを使用して、電子メールアドレスがすでにDBに存在するかどうかを確認するにはどうすればよいですか?私はサービスのデータベースとしてMongoDBを使用しています。

const {authenticate} = require('@feathersjs/authentication').hooks; 
const validator = require('validator'); 

const { 
    hashPassword, protect 
} = require('@feathersjs/authentication-local').hooks; 

module.exports = { 
    before: { 
     all: [], 
     find: [authenticate('jwt')], 
     get: [authenticate('jwt')], 
     create: [hashPassword(), 
     function(context) { 
      let input = context.data; 
      const userService = app.service('users'); 

      if (validator.isEmpty(input.name)) { 
       throw new Error('Please enter your name.'); 
      } 
      if (validator.isEmpty(input.email)) { 
       throw new Error('Please enter your email address.'); 
      } else if (!validator.isEmail(input.email)) { 
       throw new Error('Please enter a valid email address.'); 
      } 
      if (validator.isEmpty(input.password)) { 
       throw new Error('Please enter a password for your account.'); 
      } 

      userService.find({ 
       query: { 
        email: input.email 
       } 
      }).then((users) => { 
       console.log(users); 
      }) 
     } 
     ], 
     update: [hashPassword(), authenticate('jwt')], 
     patch: [hashPassword(), authenticate('jwt')], 
     remove: [authenticate('jwt')] 
    }, 

    after: { 
     all: [ 
      // Make sure the password field is never sent to the client 
      // Always must be the last hook 
      protect('password') 
     ], 
     find: [], 
     get: [], 
     create: [], 
     update: [], 
     patch: [], 
     remove: [] 
    }, 

    error: { 
     all: [], 
     find: [], 
     get: [], 
     create: [ 

     ], 
     update: [], 
     patch: [], 
     remove: [] 
    } 
}; 

答えて

0

コンテキストオブジェクトは、フックのサービスへのアクセスを許可します。 (これが問題の解決策です)したがって、次のコードを使用して、ユーザーの電子メールアドレスがDBに存在するかどうかを判断できます。

さらに、電子メールの重複チェックは、ユーザーがDBに挿入された後に実行されます(約束通りです)。したがって、asyncとawaitは、続行する前に解決する約束を待つために使用されます。

module.exports = { 
    before: { 
     all: [], 
     find: [authenticate('jwt')], 
     get: [authenticate('jwt')], 
     create: [hashPassword(), 
     async context => { 
      let input = context.data; 
      //const userService = app.service('users'); 

      if (validator.isEmpty(input.name)) { 
       throw new Error('Please enter your name.'); 
      } 
      if (validator.isEmpty(input.email)) { 
       throw new Error('Please enter your email address.'); 
      } else if (!validator.isEmail(input.email)) { 
       throw new Error('Please enter a valid email address.'); 
      } 
      if (validator.isEmpty(input.password)) { 
       throw new Error('Please enter a password for your account.'); 
      } 

      await context.service.find({ 
       query: { 
        email: input.email 
       } 
      }).then((data) => { 
       if (data.data.length) { 
       throw new Error('This email address is already in use by somebody else.'); 
      } 
      }); 

     } 
     ], 
     update: [hashPassword(), authenticate('jwt')], 
     patch: [hashPassword(), authenticate('jwt')], 
     remove: [authenticate('jwt')] 
    }, 
関連する問題