Feathers: рд╕рдВрдШреЛрдВ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 8 рдЕрдЧре░ 2016  ┬╖  30рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: feathersjs/feathers

рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкрдВрдЦ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдРрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрд╡рд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рдПрдХ рд╣реБрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдЖрд╕рд╛рди рд╣реИ? рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣ рд╕реЗрд╡рд╛ рдХрдИ рдПрдирдИрдбреАрдмреА рдлрд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдореИрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░реБ?

'use strict';

module.exports = function(options) {
  return function(hook) {

    // access other db files here and get data

    hook.data = {
        putDataHere: newData
    };
  };
};

рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА

рд╣рд╛рдВред рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐ hook.app.service('servicename') рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЬрд┐рд╕ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ hook рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реИ) рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рднреА рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рддреА рд╣реИрдВ:

module.exports = function(options) {
  return function(hook) {
    return hook.app.service('otherservice').find({
      query: { name: 'David' }
    }).then(page => {
      const davids = page.data;

      hook.data.davids = davids;
      // Or you can replace all the data with
      hook.data = { davids };

      // IMPORTANT: always return the `hook` object in the end
      return hook;
    });
  };
};

рд╕рднреА 30 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рд╣рд╛рдВред рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐ hook.app.service('servicename') рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЬрд┐рд╕ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛ hook рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реИ) рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рднреА рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рддреА рд╣реИрдВ:

module.exports = function(options) {
  return function(hook) {
    return hook.app.service('otherservice').find({
      query: { name: 'David' }
    }).then(page => {
      const davids = page.data;

      hook.data.davids = davids;
      // Or you can replace all the data with
      hook.data = { davids };

      // IMPORTANT: always return the `hook` object in the end
      return hook;
    });
  };
};

@daffl рдмрд╣реБрдд рдмрд╣реБрдд рдзрдиреНрдпрд╡рд╛рджред рдореБрдЭреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдЗрддрдирд╛ рдЖрд╕рд╛рди рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдореЗрдВ рдирд╣реАрдВ рдорд┐рд▓рд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдпрд╛рдж рдХрд┐рдпрд╛ рд╣реЛрдЧрд╛ред

рдареАрдХ рд╣реИ рддреЛ рдпрд╣ рдПрдХ рдЦреЛрдЬ рдХреЙрд▓ рд╣реИ рдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдпрд╣ рд╣реБрдХ рд╕реЗ рдкрд╣рд▓реЗ рд╣реИ (рдмрд╕ рдЕрдЧрд░ рдЖрдкрдХреЛ рдЙрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)

рдореБрдЭреЗ рдХреЗрд╡рд▓ 25 рдорд┐рд▓ рд░рд╣реЗ рд╣реИрдВ рд▓реЗрдХрд┐рди рд╕реИрдХрдбрд╝реЛрдВ рд╣реИрдВред рдЕрдЧрд░ рдореИрдВ рд╕реАрдорд╛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реВрдВ, рддреЛ рдореБрдЭреЗ рдХреЗрд╡рд▓ 5 рдЖрдЗрдЯрдо рдорд┐рд▓рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ рдФрд░ рдореИрдВ рд╕рдм рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реВрдВ?

module.exports = function(options) {
  return function(hook) {

    const dataSet = hook.params.query.dataSet;
    const userVector = hook.params.query.userVector;

    return hook.app.service('data').find({
      query: { dataSet: dataSet, $limit:2000 }
    }).then(page => {

      // lots of magic here

      //console.log(page.data);

      hook.result = page.data;

      return hook;
    });
  };
};

рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ paginate.max рд▓рд┐рдП рдХреМрди рд╕рд╛ рд╡рд┐рдХрд▓реНрдк рд╕реЗрдЯ рдХрд┐рдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рд╕реБрд░рдХреНрд╖рд╛ рдХрд╡рдЪ рд╣реИ рддрд╛рдХрд┐ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд▓рд╛рдЦреЛрдВ рд░рд┐рдХреЙрд░реНрдб рдХрд╛ рдЕрдиреБрд░реЛрдз рди рдХрд░ рд╕рдХреЗред рд╕рднреА рдирдП рдПрдбреЗрдкреНрдЯрд░ рдореЗрдВ рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╕рднреА рд░рд┐рдХреЙрд░реНрдб рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

return hook.app.service('data').find({
      paginate: false,
      query: { dataSet: dataSet }
    }).then(data => {
      // data is an array
    });

рдЬрдм рдореИрдВ рдРрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рддреЛ рдореБрдЭреЗ 0 рд░рд┐рдХреЙрд░реНрдб рдорд┐рд▓рддреЗ рд╣реИрдВред рдЬрдм рдореИрдВ рдкреЗрдЬрд┐рдиреЗрд╢рди рд╣рдЯрд╛рддрд╛ рд╣реВрдВ: рдЭреВрдард╛ рдореБрдЭреЗ 25 рдорд┐рд▓рддреЗ рд╣реИрдВред

рдХреНрдпрд╛ npm ls feathers-nedb v2.4.1 рджрд┐рдЦрд╛рддрд╛ рд╣реИ? рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдкрдХреЛ рддрджрдиреБрд╕рд╛рд░ рдЕрдкрдирд╛ package.json рдЕрдкрдбреЗрдЯ рдХрд░рдирд╛ рдкрдбрд╝ рд╕рдХрддрд╛ рд╣реИред

тФФтФАтФА [email protected]

рдореИрдВрдиреЗ рдЕрднреА рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд┐рдпрд╛ рд╣реИ рдХрд┐ paginate: false рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ:

const feathers = require('feathers');
const rest = require('feathers-rest');
const socketio = require('feathers-socketio');
const hooks = require('feathers-hooks');
const nedb = require('feathers-nedb');
const bodyParser = require('body-parser');
const handler = require('feathers-errors/handler');
const NeDB = require('nedb');

// A Feathers app is the same as an Express app
const app = feathers();
const db = new NeDB({
  filename: './data/messages.db',
  autoload: true
});

// Parse HTTP JSON bodies
app.use(bodyParser.json());
// Parse URL-encoded params
app.use(bodyParser.urlencoded({ extended: true }));
// Register hooks module
app.configure(hooks());
// Add REST API support
app.configure(rest());
// Configure Socket.io real-time APIs
app.configure(socketio());
// Register our memory "users" service
app.use('/todos', nedb({
  Model: db,
  paginate: {
    default: 20,
    max: 50
  }
}));
// Register a nicer error handler than the default Express one
app.use(handler());

const promises = [];

for(let i = 0; i < 700; i++) {
  promises.push(app.service('todos').create({ text: `Item #${i}`}));
}

Promise.all(promises).then(function() {
  app.service('todos').find({
    paginate: false,
    query: {}
  }).then(data => console.log(data));
});

// Start the server
app.listen(3333);

рдореБрдЭреЗ рдХрдВрд╕реЛрд▓ рдореЗрдВ 700 рдЖрдЗрдЯрдо рд▓реЙрдЧ рд╣реЛ рд░рд╣реЗ рд╣реИрдВред рдХреНрдпрд╛ рдЖрдкрдиреЗ рдЧрд▓рддреА рд╕реЗ рдореБрдЦреНрдп рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрдЬрд╛рдп рдХреНрд╡реЗрд░реА рдореЗрдВ paginate: false рдЬреЛрдбрд╝ рджрд┐рдпрд╛ рдерд╛?

рдпрд╣ рдЬреЛ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ рд╣реИ:

'use strict';

module.exports = function(options) {
  return function(hook) {

    const dataSet = hook.params.query.dataSet;
    const userVector = hook.params.query.userVector;

    return hook.app.service('data').find({
      paginate: false,
      query: { dataSet: dataSet, $limit:2000 }
    }).then(page => {

      // lots of magic here
      console.log(page.data);

      hook.result = page.data;

      return hook;
    });
  };
};

рдЕрднреА рднреА 0 рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ рдФрд░ 25 рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛ рдЪрд░ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ рдФрд░ 5 рдкрд░рд┐рдгрд╛рдо рдмрд┐рдирд╛ рд╕реАрдорд╛ рдХреЗред

рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдпрд╣ рдЗрд╕рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рд╣реИ:

'use strict';

module.exports = function(options) {
  return function(hook) {

    const dataSet = hook.params.query.dataSet;
    const userVector = hook.params.query.userVector;

    return hook.app.service('data').find({
      paginate: false,
      query: { dataSet: dataSet }
    }).then(page => {

      // lots of magic here
      console.log(page);

      hook.result = page;

      return hook;
    });
  };
};

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдЕрдм рдкреЗрдЬ.рдбреЗрдЯрд╛ рдореЗрдВ рдирд╣реАрдВ рд╣реИрдВ, рдмрд▓реНрдХрд┐ рдкреЗрдЬ рд╡реЗрд░рд┐рдПрдмрд▓ рдореЗрдВ рд╣реИрдВред

рд╕рдмрдХ рд╕реАрдЦрд╛ :)

рдУрд╣ рдФрд░ рдзрдиреНрдпрд╡рд╛рдж @daffl рдЖрдкрдХреА рдорджрдж рдХреЗ рд▓рд┐рдПред

рдЧреНрд░рд╛рд╣рдХ рдкрдХреНрд╖ рдкрд░ рдпрд╣ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред ( paginate: false, рдЪрд░)ред

рдХреНрд▓рд╛рдЗрдВрдЯ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рдмреАрдЪ рдХреЗрд╡рд▓ query рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдореИрдВ рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕реЗ рд╕рднреА рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддрд╛ рд╣реВрдВ (рдпрджрд┐ рдЖрдкрдХреЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд▓рд╛рдЦреЛрдВ рд░рд┐рдХреЙрд░реНрдб рд╣реИрдВ рддреЛ рдпрд╣ рд╕рд░реНрд╡рд░ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреЛрдиреЛрдВ рдХреЛ рдорд╛рд░ рджреЗрдЧрд╛)ред рдпрджрд┐ рдЗрд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЛрдИ рд░рд╛рд╕реНрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдкрдХреЛ рд╕рд░реНрд╡рд░ рдкрд░ рдПрдХ рд╣реБрдХ рдореЗрдВ params.query рд╕реЗ params рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ (рдЬреИрд╕реЗ $paginate ) рдХреЛ рдореИрдк рдХрд░рдирд╛ рд╣реЛрдЧрд╛:

app.service('data').before({
  find(hook) {
    if(hook.params.query && hook.params.query.$paginate) {
      hook.params.paginate = hook.params.query.$paginate === 'false' || hook.params.query.$paginate === false;
      delete hook.params.query.$paginate;
    }
  }
});

рдореИрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдиреЗ рдХреА рдЪреЗрддрд╛рд╡рдиреА рдХреЛ рд╕рдордЭрддрд╛ рд╣реВрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореИрдВ рдЬреЛ рдЯреВрд▓ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рд╕рд┐рд░реНрдл рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИред рд╕рдм рдХреБрдЫ рдХреЗ рд▓рд┐рдП рдлрд┐рд░ рд╕реЗ рдзрдиреНрдпрд╡рд╛рджред

@daffl рд╣рд╛рдп, рдореИрдВ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкреЛрд╕реНрдЯ рдХрд┐рдП рдЧрдП рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкрд╛рд╕ рдкреЛрд╕реНрдЯ рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░ рд░рд╣рд╛ рд╣реВрдВред

module.exports = function(options) {
  return function(hook) {
    // hook.getPosts = true;
    const id = hook.result.id;
    console.log("id");

    return hook.app.service('posts').find({
      paginate: false,
      query: { postedBy: id }
    }).then(function(posts){
      console.log("posts");
      // Set the posts on the user property
      hook.result.posts = posts.data;
      // Always return the hook object or `undefined`
      return hook;
    });
  };
};

рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рд╕рд░реНрд╡рд░ рдЕрдирдВрдд рд▓реВрдк рдореЗрдВ рдЪрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдиреЛрдб рдРрдк рдЕрдВрддрддрдГ рдХреНрд░реИрд╢ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВ MySQL рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдкрдиреЗ рдбреАрдмреА рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдиреБрдХреНрд░рдо рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реВрдВред

рдореИрдВ рдХреНрдпрд╛ рдЧрд▓рдд рдХрд░ рд░рд╣рд╛ рд╣реВрдВ?

рдЕрджреНрдпрддрди

рдореИрдВрдиреЗ postedBy рдлрд╝реАрд▓реНрдб рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреЛрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рд╣реБрдХ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рддреЛ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реБрдХ рдкреЛрд╕реНрдЯ рд╣реБрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ рдЬреЛ рдмрджрд▓реЗ рдореЗрдВ рдореВрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╣реБрдХ рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рд▓реВрдк рдЬрд╛рд░реА рд░рд╣реЗрдЧрд╛ рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдирдВрдд рд▓реВрдк рдФрд░ рдореЗрдореЛрд░реА рдУрд╡рд░рдлрд╝реНрд▓реЛ рд╣реЛрдЧрд╛ред

рдХреЛрдИ рднреА рд╡рд┐рдЪрд╛рд░ рдХреИрд╕реЗ рдХреЗрд╡рд▓ рдПрдХ рдЙрдерд▓реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдпрд╛рдиреА, рд╣реБрдХ рдХреЗрд╡рд▓ рдкрд╣рд▓реЗ рд╕реНрддрд░ рдкрд░ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЦреАрдВрдЪ рд▓реЗрдЧрд╛ред

@daffl рдЖрдкрдХрд╛ рд╡рд┐рдЪрд╛рд░ рдХрдорд╛рд▓ рдХрд╛ рд╣реИ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдХреЛрдб рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред
рдореБрдЭреЗ рдЗрд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП hook.paginate рдХреЛ hook.params.paginate рдореЗрдВ рдмрджрд▓рдирд╛ рдкрдбрд╝рд╛ред
рдФрд░ рдореИрдВрдиреЗ рдереЛрдбрд╝рд╛ рдмрджрд▓рд╛рд╡ рдХрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рд╡рд╣рд╛рдВ рдЬреЛ рдЪрд╛рд╣реЗрдВ рднреЗрдЬ рд╕рдХреЗрдВред
рддреЛ рдЖрдк $paginate рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: {value: false} рдкреЗрдЬрд┐рдиреЗрд╢рди рдХреЛ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП or
$paginate: {рдорд╛рди: {рдбрд┐рдлрд╝реЙрд▓реНрдЯ: 100, рдЕрдзрд┐рдХрддрдо: 2000}} рдкреГрд╖реНрда рдкрд░ рдЕрдВрдХ рд▓рдЧрд╛рдирд╛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП

app.service('data').before({ find(hook) { if(hook.params.query.$paginate) { hook.params.paginate = hook.params.query.$paginate.value; delete hook.params.query.$paginate; } } });

рдПрдХ рдФрд░ рдмрд╛рдд рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рд╣реИ, рдЬрдм рдкреЗрдЬрд┐рдиреЗрд╢рди рдЕрдХреНрд╖рдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛ res.data рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ рдмрд▓реНрдХрд┐ рд╕реНрд╡рдпрдВ рд╣реА рд╣реЛрддрд╛ рд╣реИред

@ рднрд╛рдЧреНрдп-рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

app.service('data').before({
  find(hook) {
    if(hook.params.query && hook.params.query.$paginate) {
      hook.params.paginate = hook.params.query.$paginate === 'false' || hook.params.query.$paginate === false;
      delete hook.params.query.$paginate;
    }
  }
});

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ $paginate рдХреЛ рдЧрд▓рдд рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЬреЛ рдХрд┐ рдЗрд╕ рд╣реБрдХ рдХрд╛ рдмрд┐рдВрджреБ рд╣реИ, рдЗрд╕реЗ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП ...), if рднреА рдЧрд▓рдд рд╣реЛрдиреЗ рд╡рд╛рд▓рд╛ рд╣реИред рд╢рд╛рдпрдж

app.service('data').before({
  find(hook) {
    if(hook.params.query && hook.params.query.hasOwnProperty('$paginate')) {
      hook.params.paginate = hook.params.query.$paginate === 'false' || hook.params.query.$paginate === false;
      delete hook.params.query.$paginate;
    }
  }
});

рдирдорд╕реНрддреЗред рдХреНрдпрд╛ рдХреЛрдИ рдореБрдЭреЗ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдкрдВрдЦ рд╕реЗрд╡рд╛рдУрдВ рдореЗрдВ рдПрдХ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╣реИ рдпрд╛ рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП? рдзрдиреНрдпрд╡рд╛рдж!
рд╕реАрд╕реА @ daffl

рдПрдХ findOne рд╕рд┐рд░реНрдл рдПрдХ find рдЬрд┐рд╕рдореЗрдВ $limit 1 рд╣реИ:

app.service('myservice').find({ query: { name: 'test', $limit: 1 } })
 .then(page => page.data[0])
 .then(result => console.log('Got', result);

@daffl рдореИрдВрдиреЗ рдкреВрдЫрд╛ рдХреНрдпреЛрдВрдХрд┐ рдиреЗрд╡рд▓реЗ рдХреЛ рдорд┐рд▓ рдЧрдпрд╛ рд╣реИ рдФрд░ рдореИрдВрдиреЗ рд╕реБрдЭрд╛рд╡ рджрд┐рдпрд╛ рд╣реИ рдХрд┐ рдЕрдЧрд░ рдХреБрдЫ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдорд┐рд▓рд╛ рд╣реИ рддреЛ рдпрд╣ рд╕рднреА рдмрд╛рдХреА рд╕рдВрдЧреНрд░рд╣ рдкрд░ рдЦреЛрдЬ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рддреЛ, рдореИрдВрдиреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрд╛ findOne рдХреЛ рдХреБрдЫ рд╕реНрдорд╛рд░реНрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реАрдорд╛ = 1 рдХреЗ рд╕рд╛рде рдЦреЛрдЬреЗрдВ ... рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкреВрдЫрд╛ред

рдореИрдВ рдЖрдорддреМрд░ рдкрд░ рдЗрд╕реЗ рддреНрд╡рд░рд┐рдд рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реВрдВ:

const employee = (await context.app.service('employees').find({ query: { userId: user.id }, paginate: false }))[0];

рдореИрдВрдиреЗ рдЕрднреА .findOne() рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рдмрдирд╛рдпрд╛ рд╣реИ: рдкрдВрдЦ-рдЦреЛрдЬ

рдореБрдЭреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЗ рд▓рд┐рдП $paginate рд╡рд░реНрдХрдЕрд░рд╛рдЙрдВрдб рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдЙрджрд╛рд╣рд░рдг рдирд╣реАрдВ рдорд┐рд▓рд╛ред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓рд╛ рдПрдХ рд╣реБрдХ рдмрдирд╛рдпрд╛ рдЬреЛ рдХреБрдЫ рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд╕рд╛рде app.hooks.js рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдЪрд▓рддрд╛ рд╣реИ:

module.exports = function () {
  return context => {
    if (context.params.query && hook.params.query.hasOwnProperty('$paginate')) {
      context.params.paginate = context.params.query.$paginate === 'false' || context.params.query.$paginate === false;
      delete context.params.query.$paginate;
    }
  };
};

рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рдЗрдХрд╛рдИ рдпрд╛ рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ?

рддреЛ рдЕрдЧрд░ рдореЗрд░реЗ рдкрд╛рд╕ рдореЗрд░реЗ рд╣реБрдХ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИ

const records = getItems(context);
records.authors = await context.app.service('users') .find({ query: { _id: { $in: records.authorIds } } }, context.params);

рдореИрдВ рдЕрдкрдиреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕рдВрджрд░реНрдн.рдПрдк.рд╕реЗрд╡рд╛ рдХрд╛ "рдордЬрд╛рдХ" рдХреИрд╕реЗ рдХрд░реВрдВ?

рдХреНрдпрд╛ рдореБрдЭреЗ рдЗрд╕реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдкрдиреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ?

contextBefore = { type: 'before', params: { provider: 'socketio', user: { _id: 1 } }, data: { _id: 1, }, };

рдореИрдВ рдкрдВрдЦ-рдкреНрд▓рд╕ рдЬрдирд░реЗрдЯрд░ рд╕реЗ рдЙрддреНрдкрдиреНрди рдпреВрдирд┐рдЯ-рдЯреЗрд╕реНрдЯ рдСрдЯреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред
https://generator.phers-plus.com/get-started/#unit -test-for-a-hook

рдпрд╛ рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рдПрдХреАрдХрд░рдг рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП?

рдореИрдВ рдХреБрдЫ рд╕рдордп рдкрд╣рд▓реЗ рдореЙрдХрд┐рдВрдЧ рд░реВрдЯ рдкрд░ рдЧрдпрд╛ рд╣реВрдВред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдмрд╣реБрдд рдмреБрд░рд╛ рд╡рд┐рдЪрд╛рд░ рд╣реИред рдЖрдкрдХреЛ рдЕрдВрддрддрдГ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдкрдВрдЦреЛрдВ рдХрд╛ рдордЬрд╝рд╛рдХ рдЙрдбрд╝рд╛рдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдИ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдореЙрдХ рдкрдВрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдк рдЭреВрдареЗ рдирдХрд╛рд░рд╛рддреНрдордХ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд┐рдпрд╛ред

рдлреЗрджрд░реНрд╕ рдРрдк рдХреЛ рдЗрдВрд╕реНрдЯреЗрдВрдЯ рдХрд░рдирд╛ рдмрд╣реБрдд рддреЗрдЬрд╝ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореЙрдХ рдХреЗ рдмрдЬрд╛рдп рдлреЗрджрд░реНрд╕ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░реЗрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдХреНрд▓реА+ рдЯреЗрд╕реНрдЯ рдХрд╛ рддрд░реАрдХрд╛ рдЕрдкрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдореИрдВрдиреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрд╛ рдерд╛ рдЬреЛ рдЗрд╕рдХрд╛ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред https://medium.com/feeds-plus/automatic-tests-with-feeds-plus-cli-4844721a29cf

рдзрдиреНрдпрд╡рд╛рдж рдПрдбреА, рдореИрдВрдиреЗ рджреЗрдЦрд╛ рд╣реИ рдХрд┐, рдорд╣рд╛рди рд▓реЗрдЦ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдорджрдж рдХреАред

рдореИрдВ рдЕрдкрдиреЗ рд╕рдВрджрд░реНрдн рд╡рд╕реНрддреБ рдореЗрдВ рдРрдк рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкрд░ рд╕рдВрдШрд░реНрд╖ рдХрд░ рд░рд╣рд╛ рдерд╛ рд▓реЗрдХрд┐рди рдЕрдВрддрддрдГ рдЗрд╕реЗ рдХрд╛рдо рдХрд░ рд░рд╣рд╛ рдерд╛, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ!

    const app = feathers();

    contextBefore = {
      type: 'before',
      params: { provider: 'socketio', user: { _id: 1 } },
      data: {
        _id: 1,
      },
      app,
    };

рддрдм рдореБрдЭреЗ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рд╕рдВрд╢реЛрдзрди рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдПрд╕рд┐рдВрдХ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рддрд╛ рдерд╛ред

it('patch test', async () => {
    contextBefore.app.use('users', {
      async find() {
        return { data: [ { expectedResultObj1 }, { expectedResultObj2 } ] };
      }
    });
    contextBefore.data = {
      _id: 1,
    };
    assert(true);

    await hookToTest()(contextBefore);

    assert.deepEqual(contextBefore.data, {
      _id: 1,
      expectedResultObject1,
      expectedResultObject2,
    });
  });

рдХреНрдпрд╛ рдпрд╣ рдХрд░рдиреЗ рдХрд╛ рдпрд╣ рд╕рд╣реА рддрд░реАрдХрд╛ рд╣реИ рдпрд╛ рдХреЛрдИ рдмреЗрд╣рддрд░ рддрд░реАрдХрд╛ рд╣реИ?

рдЕрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ

@ рднрд╛рдЧреНрдп-рдкреНрд░реМрджреНрдпреЛрдЧрд┐рдХреА рдЖрдк рд╕рд╣реА рдХрд╣ рд░рд╣реЗ рд╣реИрдВред рдореИрдВрдиреЗ рдЕрдкрдирд╛ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ред рдпрд╣ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП:

app.service('data').before({
  find(hook) {
    if(hook.params.query && hook.params.query.$paginate) {
      hook.params.paginate = hook.params.query.$paginate === 'false' || hook.params.query.$paginate === false;
      delete hook.params.query.$paginate;
    }
  }
});

рдХреНрд╡реЗрд░реА $ рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╢реВрдиреНрдп рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА

рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

codeus-de picture codeus-de  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

Vincz picture Vincz  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

intumwa picture intumwa  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

RickEyre picture RickEyre  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

arve0 picture arve0  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ