6

I want to create a Class and make it available on my controllers. I don't want to use helpers in this particular case because I'm planning to create an npm package later with this code. I don't want to create a package now, because I don't want my code to be public.

I've tried adding this code inside a file in the hooks folder:

console.log('Hook executed!');

module.exports = class Test {
    constructor() {
        console.log('Object created!');
    }
}

When I lift the app I see that the hook it's being loaded:

info: Starting app...

Hook executed!

Then in a random controller I'm adding:

const test = new Test();

And when I execute the controller:

ReferenceError: Test is not defined

Update: According to the documentation hooks are defined in a different way. So maybe using hooks is not the best approach. Any ideas on how to make a Class available on the controllers with or without using hooks?

fsinisi90
  • 1,138
  • 1
  • 16
  • 45
  • Provided the Test class is defined in a file named Test.js right under the hook folder. Did you `import Test from 'path_to_hooks/hooks/Test.js` in your controller? – remix23 Sep 03 '18 at 16:14
  • "in a random controller": would you happen to be in [this case](https://stackoverflow.com/questions/18020113/exporting-classes-with-node-js#18020211)? – Stock Overflaw Sep 03 '18 at 16:40
  • @remix23 I'm getting `SyntaxError: Unexpected token import` if I put that code inside a controller. – fsinisi90 Sep 04 '18 at 12:21
  • @StockOverflaw I've tried requiring the file in my bootstrap.js file and I had the same error. – fsinisi90 Sep 04 '18 at 12:28

3 Answers3

6

Your files should be like these files shown bellow:

myClass.js

'use strict';
class Test {
  constructor() {
    this.name = 'test';
  }
}
module.exports = Test;

The other file which you want to use this class should look like this:

index.js

const Test = require('./myClass');
let a = new Test();
console.log(a.name);

After that when you run index.js file, you will see 'test' in your console.

Seyed Ali Akhavani
  • 633
  • 1
  • 6
  • 18
2

Well, researching a bit more about Sails hooks I found that they have a special syntax so that's not what I wanted. Also, as I've already said, I didn't want a controller or a helper.

So, since there's no default way in Sails to create a package without actually creating it and including it to the project dependencies, I took a different approach. It's not very elegant, but it solves this particular case. I've simply placed my Test.js file inside the api folder, and included it in my controller like this:

const Test = require(__dirname + '/../../test');
let test = new Test();
fsinisi90
  • 1,138
  • 1
  • 16
  • 45
0

The docs say that hooks are loaded in the sails.hooks object and to call a specific hook you use sails.hooks[<hook-name>]

I think you want to use something like this to use your hook sails.hooks.Test

More about it https://sailsjs.com/documentation/concepts/extending-sails/hooks/using-hooks

denixtry
  • 2,928
  • 1
  • 21
  • 19