javascript - FeathersJS auk 服务器填充 Hook 不起作用

标签 javascript hook feathersjs

我正在尝试使用新的填充 Hook ,但它似乎不起作用。我只是不知道我做错了什么。

我有与 merchants 模型 1:1 相关的 merchatTypeMap 模型,当我查询 merchantTypeMap 时,它应该用附上关联商家。

merchantTypeMap 服务:

'use strict';

const service = require('feathers-sequelize');
const merchantTypeMap = require('./merchantTypeMap-model');
const hooks = require('./hooks');

module.exports = function(){
  const app = this;

  const options = {
    Model: merchantTypeMap(app.get('sequelize')),
    paginate: {
      default: 5,
      max: 25
    }
  };

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

  // Get our initialize service to that we can bind hooks
  const merchantTypeMapService = app.service('/merchantTypeMaps');

  // Set up our before hooks
  merchantTypeMapService.before(hooks.before);

  // Set up our after hooks
  merchantTypeMapService.after(hooks.after);
};

这是我的merchantTypeMap模型代码:

'use strict';

// merchantTypeMap-model.js - A sequelize model
// 
// See http://docs.sequelizejs.com/en/latest/docs/models-definition/
// for more of what you can do here.

const Sequelize = require('sequelize');

module.exports = function(sequelize) {
  const merchantTypeMap = sequelize.define('merchantTypeMaps', {
    id: {
      type: Sequelize.INTEGER(10),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    merchantId: {
      type: Sequelize.INTEGER(10),
      allowNull: true,
      references: {
        model: 'merchants',
        key: 'id'
      },
      field: 'merchant_id'
    },
    merchantTypeId: {
      type: Sequelize.INTEGER(10),
      allowNull: true,
      references: {
        model: 'merchantTypes',
        key: 'id'
      },
      field: 'merchantType_id'
    }
  }, {
    freezeTableName: true
  });

  merchantTypeMap.belongsTo(sequelize.models.merchants, {foreignKey: 'merchant_id'});

  merchantTypeMap.sync();

  return merchantTypeMap;
};

这是我的merchantTypeMap 服务 Hook :

'use strict';

const globalHooks = require('../../../hooks');
const hooks = require('feathers-hooks-common');

const schema = {
  include: [{
    service: 'merchants',
    nameAs: 'merchantItem',
    parentField: 'merchantId',
    childField: 'id',
  }]
};

exports.before = {
  all: [],
  find: [],
  get: [],
  create: [],
  update: [],
  patch: [],
  remove: []
};

exports.after = {
  all: [],
  find: [
    hooks.populate( { schema } )
  ],
  get: [
    hooks.populate( { schema } )
  ],
  create: [],
  update: [],
  patch: [],
  remove: []
};

商家服务:

'use strict';

const service = require('feathers-sequelize');
const merchantTypeMap = require('./merchantTypeMap-model');
const merchants = require('./merchants-model');
const hooks = require('./hooks');

module.exports = function(){
  const app = this;

  merchantTypeMap(app.get('sequelize'));

  const options = {
    Model: merchants(app.get('sequelize')),
    paginate: {
      default: 5,
      max: 25
    }
  };

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

  // Get our initialize service to that we can bind hooks
  const merchantsService = app.service('/merchants');

  // Set up our before hooks
  merchantsService.before(hooks.before);

  // Set up our after hooks
  merchantsService.after(hooks.after);
};

以及商家模型:

'使用严格';

// merchants-model.js - A sequelize model
// 
// See http://docs.sequelizejs.com/en/latest/docs/models-definition/
// for more of what you can do here.

const Sequelize = require('sequelize');

module.exports = function(sequelize) {
  const merchants = sequelize.define('merchants', {
    id: {
      type: Sequelize.INTEGER(10),
      allowNull: false,
      primaryKey: true,
      autoIncrement: true,
      field: 'id'
    },
    title: {
      type: Sequelize.STRING,
      allowNull: true,
      field: 'title'
    },
    latitude: {
      type: Sequelize.STRING,
      allowNull: true,
      field: 'latitude'
    },
    longitude: {
      type: Sequelize.STRING,
      allowNull: true,
      field: 'latitude'
    },
    address: {
      type: Sequelize.STRING,
      allowNull: true,
      field: 'address'
    },
    icon: {
      type: Sequelize.STRING,
      allowNull: true,
      field: 'icon'
    },
    zoneId: {
      type: Sequelize.INTEGER(10),
      allowNull: true,
      references: {
        model: 'zones',
        key: 'id'
      },
      field: 'zone_id'
    }
  }, {
    freezeTableName: true
  });

  merchants.belongsToMany(sequelize.models.merchantTypes, {through: sequelize.models.merchantTypeMaps});

  merchants.sync();

  return merchants;
};

最佳答案

您需要使用 raw: true 选项将 Sequelize 配置为返回纯 JS 对象,而不是其 ORM 对象。

顺便说一句,Hooks v3 即将发布。所有钩子(Hook)(包括 populate)都会自动将 Sequelize 和 Mongoose ORM 转换为纯 JS 对象。对于某些人来说,这可能是一个突破性的改变。

相关:Sequelize - How can I return JSON objects of the database results only?

[编辑] ORM 对象的转换可能是在 Feathers 服务中完成,而不是通过钩子(Hook)完成。这样,在人们编写的自定义 Hook 中就不会出现问题。

关于javascript - FeathersJS auk 服务器填充 Hook 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41572336/

相关文章:

javascript - 如何将表排序器中的 href 值发送到对话框模式?

node.js - 如何从钩子(Hook)访问 Mongoose 模型

javascript - 使用确认对话框提交表单时丢失按钮值

javascript - 幕后发生了什么,这是正确的方法吗? (通过 Javascript 修改 DOM)

javascript - FeathersJS - 在哪里链接钩子(Hook)?

c - 不同系统调用 Hook 的行为不均

ios - Instagram InstagramCaption 不工作

javascript - 嵌套循环内上下文值未定义

javascript - 使用feathersjs 设置生产

javascript - 选择 Box 和 jquery