2017-12-19 17 views
0

사용자 인증 정보를 얻기 위해/me를 추가하려고합니다. 이것이 내 파일에있는 것입니다. users.services 파일에서 route/me를 추가하려고 시도했지만이 오류가 나타납니다. "오류 : MethodNotAllowed : 메서드 find이이 끝점에서 지원되지 않습니다."사용자를위한 맞춤 경로를 만드는 방법은 무엇입니까? 그리고 그것에 후크를 추가하는 방법?

'/ me'를 라우트하는 GET 메소드에 대한 사용자 오브젝트 (토큰 기반)에 대한 응답을 얻고 싶습니다.

users.service.js

// Initializes the `users` service on path `/users` 
const createService = require('feathers-sequelize'); 
const createModel = require('../../models/users.model'); 
const hooks = require('./users.hooks'); 

module.exports = function (app) { 
    const Model = createModel(app); 
    const paginate = app.get('paginate'); 

    const options = { 
    name: 'users', 
    Model, 
    paginate 
    }; 

    // Initialize our service with any options it requires 
    app.use('/users', createService(options)); 

    app.use('/me', { 
     get(id, params) { 
     return Promise.resolve([ 
      { 
      id: 1, 
      text: 'Message 1' 
      } 
     ]) 
     } 
    }) 

    // Get our initialized service so that we can register hooks and filters 
    const service = app.service('users'); 

    service.hooks(hooks); 
}; 

users.hooks.js

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

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

module.exports = { 
    before: { 
    all: [ ], 
    find: [ authenticate('jwt') ], 
    get: [], 
    create: [ hashPassword() ], 
    update: [ hashPassword() ], 
    patch: [ hashPassword() ], 
    remove: [] 
    }, 

    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: [] 
    } 
}; 

users.model.js

// See http://docs.sequelizejs.com/en/latest/docs/models-definition/ 
// for more of what you can do here. 
const Sequelize = require('sequelize'); 
const DataTypes = Sequelize.DataTypes; 

module.exports = function (app) { 
    const sequelizeClient = app.get('sequelizeClient'); 
    const users = sequelizeClient.define('users', { 

    email: { 
     type: DataTypes.STRING, 
     allowNull: false, 
     unique: true 
    }, 
    password: { 
     type: DataTypes.STRING, 
     allowNull: false 
    }, 


    }, { 
    hooks: { 
     beforeCount(options) { 
     options.raw = true; 
     } 
    } 
    }); 

    users.associate = function (models) { // eslint-disable-line no-unused-vars 
    // Define associations here 
    // See http://docs.sequelizejs.com/en/latest/docs/associations/ 
    }; 

    return users; 
}; 

답변

2

ㅁ 할 때까지

app.use('/me', { 
     get(id, params) { 
     return Promise.resolve([ 
      { 
      id: 1, 
      text: 'Message 1' 
      } 
     ]) 
     } 
    }) 

/me/:id의 경로를 구현했습니다. find 방법은 기본 경로 /me에 대해 실행되는 방법입니다.

저는 별도의 서비스가 실제로 필요하다고 생각하지 않습니다. 더 쉬운 솔루션은 /users/me 액세스하는 경우 ID를 변경하는 beforeall 후크를 사용하는 것입니다 : 당신이 후크를 사용하고 있지만 context.params.user이 정의되지, 나에게 말한했다

module.exports = function() { 
    return async context => { 
    if(context.id === 'me') { 
     context.id = context.params.user._id; 
    } 
    } 
} 
+0

. 데이터를 어떻게 채울 수 있습니까? – Facundo

+0

'authenticate ('jwt')는 그것을합니다. 현재'users.hooks.js'처럼'find' 전에'all' 전에 사용하기를 원할 것입니다. – Daff