Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
A FeathersJS hook to implement `findOrCreate`
const findOrCreate = require('./hook.find-or-create.js')
app.service('messages').hooks({
before: {
create: [findOrCreate()]
}
})
'use strict';
/**
* If the record doesn't already exist, create it and return it to the user.
*/
module.exports = function(){
return function(hook){
const service = hook.app.service('/api/records');
let params = {
query: hook.params.data,
user: hook.params.user
};
return service.find(params)
.then(response => {
// If a service has pagination enabled or not, handle either way.
response = response.data || response;
if (data.length) {
// Set `hook.result` to skip the db call to `create` if a record was found.
hook.result = response[0];
}
// Return the `hook` object for the next hook to use.
return hook;
});
};
@eikaramba

This comment has been minimized.

Copy link

commented Apr 23, 2017

line 18 data should be response i guess.

@pkreipke

This comment has been minimized.

Copy link

commented Oct 3, 2017

Improvement: line 7 - use 'hook.path' to generalize for all services.

Fix: line 9 - should be 'hook.data'.

Very helpful!

@TimNZ

This comment has been minimized.

Copy link

commented Jan 26, 2018

Helpful for inspiration.

I would replace this with something that is atomic, such as sequelize.findOrCreate for SQL db.

Depending on your logical constraints for the schema/table, you don't want someone slipping in a create between your find that returns 0 records, and the subsequent create, if you aren't using DB level constraints.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.