首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为用户定制路由?怎么给它加上钩子呢?

如何为用户定制路由?怎么给它加上钩子呢?
EN

Stack Overflow用户
提问于 2017-12-19 14:31:06
回答 1查看 1K关注 0票数 0

我正在尝试添加一个路由/me来获取用户身份验证信息。这是我档案里的东西。我尝试在/me文件中添加一个路由users.services,但是我得到了一个错误:"error: MethodNotAllowed: Method find不受这个端点的支持“。

我希望通过用户对象(基于令牌)获得对get方法的响应,以路由“/me”。

users.service.js

代码语言:javascript
复制
// 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

代码语言:javascript
复制
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

代码语言:javascript
复制
// 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;
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-19 18:06:30

你所做的

代码语言:javascript
复制
  app.use('/me', {
      get(id, params) {
        return Promise.resolve([
          {
            id: 1,
            text: 'Message 1'
          }
        ])
      }
  })

是为/me/:id实现路由。发现方法是/me的基本路由运行的方法。

不过,我认为没有必要单独提供服务。一个更简单的解决方案是使用before all钩子,如果您正在访问/users/me,该钩子将更改id。

代码语言:javascript
复制
module.exports = function() {
  return async context => {
    if(context.id === 'me') {
      context.id = context.params.user._id;
    }
  }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47889163

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档