2017-12-19 13 views
0

ユーザー認証情報を取得するためのルート/私を追加しようとしています。これが私のファイルにあります。 users.servicesファイルに/ 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

Whをあなたがしたとき

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

関連する問題