рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкрдВрдЦ рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдРрдк рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдореЗрд░реЗ рдкрд╛рд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗрд╡рд╛ рд╕реЗ рдЬреБрдбрд╝рд╛ рдПрдХ рд╣реБрдХ рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рд╕реЗ рдбреЗрдЯрд╛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХреНрдпрд╛ рдпрд╣ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдЖрд╕рд╛рди рд╣реИ? рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдХрд┐ рд╡рд╣ рд╕реЗрд╡рд╛ рдХрдИ рдПрдирдИрдбреАрдмреА рдлрд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛред рдореИрдВ рдпрд╣ рдХреИрд╕реЗ рдХрд░реБ?
'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;
});
};
};
@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; } } });
рдХреНрд╡реЗрд░реА $ рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рд╢реВрдиреНрдп рдХреЛ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА
рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рдЯрд┐рдкреНрдкрдгреА
рд╣рд╛рдВред рдЙрджрд╛рд╣рд░рдг рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ рдХрд┐
hook.app.service('servicename')
рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реЗрд╡рд╛ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЛ рдЬрд┐рд╕ рд╡рд┐рдзрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЙрд╕реЗ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдЖрдк рдПрдХ рд╡рд╛рджрд╛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдЬреЛhook
рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╣рд▓ рдХрд░рддрд╛ рд╣реИ) рдЬреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕рднреА рд╕реЗрд╡рд╛ рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд░рддреА рд╣реИрдВ: