Feathers: 연결을 κ°€μ Έμ˜€λŠ” 방법

에 λ§Œλ“  2016λ…„ 08μ›” 08일  Β·  30μ½”λ©˜νŠΈ  Β·  좜처: feathersjs/feathers

κ·Έλž˜μ„œ λ‚˜λŠ” feathers ν”„λ ˆμž„μ›Œν¬λ‘œ 앱을 κ°œλ°œν–ˆμŠ΅λ‹ˆλ‹€. λ‹€λ₯Έ μ„œλΉ„μŠ€μ˜ 데이터에 μ•‘μ„ΈμŠ€ν•˜λ €λŠ” λ°μ΄ν„°λ² μ΄μŠ€ μ„œλΉ„μŠ€μ— μ—°κ²°λœ 후크가 μžˆμŠ΅λ‹ˆλ‹€. 이것이 κ°€λŠ₯ν•˜κ³  μ‰¬μš΄κ°€μš”? ν•΄λ‹Ή μ„œλΉ„μŠ€κ°€ μ—¬λŸ¬ neDB νŒŒμΌμ— μ•‘μ„ΈμŠ€ν•  수 있기λ₯Ό λ°”λžλ‹ˆλ‹€. μ–΄λ–»κ²Œ ν•΄μ•Ό ν•˜λ‚˜μš”?

'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') λ₯Ό 톡해 λ‹€λ₯Έ μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•˜κ³  ν•„μš”ν•œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 후크가 λŒ€κΈ°ν•˜λ €λ©΄ λͺ¨λ“  μ„œλΉ„μŠ€ λ©”μ„œλ“œκ°€ 이미 μˆ˜ν–‰ν•˜λŠ” νŽΈλ¦¬ν•œ Promise( 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') λ₯Ό 톡해 λ‹€λ₯Έ μ„œλΉ„μŠ€μ— μ•‘μ„ΈμŠ€ν•˜κ³  ν•„μš”ν•œ λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•  수 μžˆμŠ΅λ‹ˆλ‹€. 후크가 λŒ€κΈ°ν•˜λ €λ©΄ λͺ¨λ“  μ„œλΉ„μŠ€ λ©”μ„œλ“œκ°€ 이미 μˆ˜ν–‰ν•˜λŠ” νŽΈλ¦¬ν•œ Promise( 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 개의 λ ˆμ½”λ“œλ₯Ό μ–»μŠ΅λ‹ˆλ‹€. νŽ˜μ΄μ§€ 맀김: falseλ₯Ό μ œκ±°ν•˜λ©΄ 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;
    });
  };
};

λ³΄μ‹œλ‹€μ‹œν”Ό κ²°κ³ΌλŠ” 더 이상 page.dataκ°€ μ•„λ‹ˆλΌ νŽ˜μ΄μ§€ λ³€μˆ˜μ—λ§Œ μžˆμŠ΅λ‹ˆλ‹€.

κ΅ν›ˆμ„ μ–»μ—ˆμŠ΅λ‹ˆλ‹€ :)

μ•„ 그리고 도움을 μ£Όμ‹  @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;
    });
  };
};

κ·ΈλŸ¬λ‚˜ 이둜 인해 μ„œλ²„κ°€ λ¬΄ν•œ 루프에 빠지고 λ…Έλ“œ 앱이 ꢁ극적으둜 μΆ©λŒν•©λ‹ˆλ‹€.

Sequelize둜 μ—°κ²°λœ DB둜 MySQL을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

λ‚΄κ°€ 뭘 잘λͺ»ν•˜κ³  있죠?

μ—…λ°μ΄νŠΈ

postedBy ν•„λ“œλ₯Ό 기반으둜 μ‚¬μš©μž ν•„λ“œλ₯Ό μ±„μš°κΈ° μœ„ν•΄ κ²Œμ‹œλ¬Όμ— λŒ€ν•΄ μœ μ‚¬ν•œ 후크λ₯Ό μ„€μ •ν–ˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ μ‚¬μš©μž 후크가 포슀트 후크λ₯Ό νŠΈλ¦¬κ±°ν•˜μ—¬ μ›λž˜ μ‚¬μš©μž 후크λ₯Ό νŠΈλ¦¬κ±°ν•˜κ³  루프가 κ³„μ†λ˜μ–΄ λ¬΄ν•œ 루프와 λ©”λͺ¨λ¦¬ μ˜€λ²„ν”Œλ‘œκ°€ λ°œμƒν•˜λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€.

얕은 κ΄€λ ¨ ν•­λͺ©λ§Œ μ±„μš°λŠ” 방법에 λŒ€ν•œ 아이디어, 즉 ν›„ν¬λŠ” 첫 번째 μˆ˜μ€€μ—μ„œλ§Œ κ΄€λ ¨ ν•­λͺ©μ„ λŒμ–΄μ˜΅λ‹ˆλ‹€.

@daffl μ½”λ“œκ°€ μž‘λ™ν•˜μ§€ μ•Šμ•˜μ§€λ§Œ μ•„μ΄λ””μ–΄λŠ” ν›Œλ₯­ν•©λ‹ˆλ‹€.
μž‘λ™ν•˜λ €λ©΄ hook.paginateλ₯Ό hook.params.paginate둜 λ³€κ²½ν•΄μ•Ό ν–ˆμŠ΅λ‹ˆλ‹€.
그리고 μ›ν•˜λŠ” λŒ€λ‘œ 보낼 수 μžˆλ„λ‘ μ•½κ°„ λ³€κ²½ν–ˆμŠ΅λ‹ˆλ‹€.
κ·Έλž˜μ„œ $paginate : {value: false} νŽ˜μ΄μ§€ 맀김을 λΉ„ν™œμ„±ν™”ν•˜κ±°λ‚˜
$paginate: { value: {default: 100, max: 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κ°€ μ•„λ‹ˆλΌ res μžμ²΄μ— μžˆλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

@fortunes-technology 당신이 λ§žμŠ΅λ‹ˆλ‹€. μ½”λ“œ μŠ€λ‹ˆνŽ«μ„ μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. 이것은 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€:

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κ°€ false둜 μ„€μ •λ˜μ–΄ 있으면(이 후크λ₯Ό λΉ„ν™œμ„±ν™”ν•˜κΈ° μœ„ν•΄... ) if도 falseκ°€ 될 κ²ƒμž…λ‹ˆλ‹€. μ•„λ§ˆλ„

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;
    }
  }
});

μ•ˆλ…•ν•˜μ„Έμš”. νŽ˜λ” μ„œλΉ„μŠ€μ— findOne κΈ°λŠ₯이 μžˆλŠ”μ§€ λ˜λŠ” κ΅¬ν˜„ 방법을 μ•Œλ €μ£Όμ‹€ 수 μžˆλ‚˜μš”? 감사 ν•΄μš”!
cc @daffl

findOne 단지 인 find Aλ₯Ό $limit 1 :

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

@daffl mongoose에 findOne이 있기 λ•Œλ¬Έμ— λ¬Όμ—ˆκ³  이미 찾은 것이 있으면 λͺ¨λ“  λ‚˜λ¨Έμ§€ μ»¬λ ‰μ…˜μ„ κ²€μƒ‰ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ œμ•ˆν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ findOne을 limit=1둜 κ²€μƒ‰ν•˜λŠ” 것보닀 더 λ˜‘λ˜‘ν•œ κ²ƒμœΌλ‘œ μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ μ œκ°€ μ§ˆλ¬Έν–ˆμŠ΅λ‹ˆλ‹€.

λ‚˜λŠ” 보톡 λΉ λ₯Έ findOne을 μœ„ν•΄ 이것을 ν•©λ‹ˆλ‹€:

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

방금 .findOne() λ©”μ†Œλ“œμš© ν”ŒλŸ¬κ·ΈμΈμ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€: feathers-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);

λ‚΄ λ‹¨μœ„ ν…ŒμŠ€νŠΈμ—μ„œ μ–΄λ–»κ²Œ context.app.serviceλ₯Ό "μ‘°λ‘±"ν•©λ‹ˆκΉŒ?

λ‚΄ contextBefore κ°œμ²΄μ— μΆ”κ°€ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

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

λ‚˜λŠ” feathers-plus μƒμ„±κΈ°μ—μ„œ μƒμ„±λœ λ‹¨μœ„ ν…ŒμŠ€νŠΈ μžλ™μ„ μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
https://generator.feathers-plus.com/get-started/#unit -test-for-a-hook

μ•„λ‹ˆλ©΄ 톡합 ν…ŒμŠ€νŠΈλ₯Ό λŒ€μ‹  μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆκΉŒ?

λ‚˜λŠ” μ–Όλ§ˆ 전에 쑰둱의 길을 κ°”λ‹€. μ•„μ£Ό λ‚˜μœ 생각이라고 μƒκ°ν•©λ‹ˆλ‹€. κ²°κ΅­ 점점 더 λ§Žμ€ Feathersλ₯Ό μ‘°λ‘±ν•΄μ•Ό ν•  κ²ƒμž…λ‹ˆλ‹€. λͺ¨μ˜ κΈ°λŠ₯이 κΉƒν„Έμ²˜λŸΌ μž‘λ™ν•œλ‹€λŠ” 보μž₯은 μ—†μœΌλ©° μ €μ²˜λŸΌ 거짓 뢀정을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

Feathers 앱을 μΈμŠ€ν„΄μŠ€ν™”ν•˜λŠ” 것은 맀우 λΉ λ₯΄λ―€λ‘œ λͺ¨μ˜ λŒ€μ‹  Feathersλ₯Ό μ‚¬μš©ν•˜μ‹­μ‹œμ˜€. 이것이 cli+ ν…ŒμŠ€νŠΈμ˜ μ ‘κ·Ό λ°©μ‹μž…λ‹ˆλ‹€.

λ‚˜λŠ” 이것을 μ–ΈκΈ‰ν•˜λŠ” 기사λ₯Ό 썼닀. https://medium.com/feathers-plus/automatic-tests-with-feathers-plus-cli-4844721a29cf

κ³ λ§ˆμ›Œ eddyy, λ‚˜λŠ” 그것을 λ³΄μ•˜κ³ , 쒋은 κΈ°μ‚¬λŠ” μ •λ§λ‘œ λ„μ›€μ΄λ˜μ—ˆμŠ΅λ‹ˆλ‹€.

λ‚΄ μ»¨ν…μŠ€νŠΈ κ°œμ²΄μ— 앱을 μΆ”κ°€ν•˜λŠ” 방법에 λŒ€ν•΄ κ³ μ‹¬ν•˜κ³  μžˆμ—ˆμ§€λ§Œ κ²°κ΅­ ν•΄κ²°ν•œ 것 κ°™μ•„μš”!

    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,
    });
  });

그것이 μ˜¬λ°”λ₯Έ λ°©λ²•μž…λ‹ˆκΉŒ μ•„λ‹ˆλ©΄ 더 λ‚˜μ€ 방법이 μžˆμŠ΅λ‹ˆκΉŒ?

μ’‹μ•„ 보인닀

@fortunes-technology 당신이 λ§žμŠ΅λ‹ˆλ‹€. μ½”λ“œ μŠ€λ‹ˆνŽ«μ„ μ—…λ°μ΄νŠΈν–ˆμŠ΅λ‹ˆλ‹€. 이것은 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€:

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;
    }
  }
});

쿼리 $limitλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. null도 λ¬΄μ‹œν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰