2017-12-23 19 views
-1

저는 NodeJS가 Laravel에서 온 것을 배우고 있습니다. 깃털 생성기에서 제공하는 후크에 사용자 등록을위한 기본 유효성 검사를 설정했습니다.이메일 주소가 있는지 어떻게 확인하나요?

전자 메일 주소가 이미 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')] 
    },