• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

NodeJS moduły w innym pliku?

Object Storage Arubacloud
0 głosów
326 wizyt
pytanie zadane 24 listopada 2018 w JavaScript przez BlvckFox Gaduła (4,240 p.)

Witam, posiadam dwa pliki .js:
app.js, który wygląda powiedzmy tak:
 

const fMath = require('mathjs');
const cfox = require("./pliki/commands.js")

cfox.cmds[0].func("2+2");

i plik commands.js, który wygląda tak:
 

const commands = [
	{
		func: (args) => {
                     let parser = fMath.parser();
                      let mathResult = parser.eval(args);
                     console.log(mathResult);
       }
	}
];
module.exports.cmds = commands;

Problem polega na tym, że plik commands.js nie może korzystać z metod mathjs, czy można jakoś wykonać phpowe include() w nodejs, dzięki któremu mógłbym korzystać z metod w innym pliku? 

2 odpowiedzi

0 głosów
odpowiedź 24 listopada 2018 przez sefir Dyskutant (8,560 p.)

W drugim pliku tak samo możesz użyć 

const fMath = require('mathjs');

 

komentarz 24 listopada 2018 przez BlvckFox Gaduła (4,240 p.)
To prawda, ale jeżeli tych require bym miał dużo to sporo kodu by mi się dublowało, można to jakoś ominąć?
komentarz 24 listopada 2018 przez sefir Dyskutant (8,560 p.)
Możesz przekazać zawartość pliku jako parametr funkcji
komentarz 24 listopada 2018 przez BlvckFox Gaduła (4,240 p.)

w sensie
 

cfox.cmds[0].func("2+2", moment);
        func: (args, module) => {
                     let parser = module.fMath.parser();
                      let mathResult = parser.eval(args);
                     console.log(mathResult);
       }

?

komentarz 24 listopada 2018 przez sefir Dyskutant (8,560 p.)

Tak albo w pierwszym pliku zrobić 

const cfox = require("./pliki/commands.js")(this);

a w drugim 

const commands = (modules)=>[
    {
        func: (args) => {
                     let parser = modules.fMath.parser();
                      let mathResult = parser.eval(args);
                     console.log(mathResult);
       }
    }
];
module.exports.cmds = commands;

 

komentarz 24 listopada 2018 przez BlvckFox Gaduła (4,240 p.)
const cfox = require("./app/commands.js")(this);
                                                                   ^

TypeError: require(...) is not a function
komentarz 24 listopada 2018 przez sefir Dyskutant (8,560 p.)

Spróbuj tak

module.exports = (modules) => {
  cmds: [
    {
      func: (args) => {
        let parser = modules.fMath.parser();
        let mathResult = parser.eval(args);
        console.log(mathResult);
      }
    }
  ]
};

 

komentarz 24 listopada 2018 przez BlvckFox Gaduła (4,240 p.)
Również nie działa, cfox.cmds jak i cmds jest uznawane za undefinied
komentarz 24 listopada 2018 przez sefir Dyskutant (8,560 p.)

Kolejny update :D

Plik 1

const modules = {};
modules.fMath = require('mathjs');
modules.cfox = require('./pliki/commands')(modules);

modules.cfox.cmds[0].func("2+2");

Plik 2

module.exports = modules => {
    return {
        cmds: [
            {
                func: (args) => {
                    let parser = modules.fMath.parser();
                    let mathResult = parser.eval(args);
                    console.log(mathResult);
                }
            }
        ]
    }
}

Zauważyłem, że musi być przekazanie obiektu przez return a nie po prostu przez =>{}. Bez sensu :P

0 głosów
odpowiedź 24 listopada 2018 przez mtk3d Nałogowiec (46,690 p.)
Tak:
https://repl.it/@MateuszCholewka/Math1
Albo jeśli nie chcesz importować mathjs wszędzie, co lepiej zrobić, to tak:
https://repl.it/@MateuszCholewka/Math2
komentarz 24 listopada 2018 przez BlvckFox Gaduła (4,240 p.)

Mój oryginalny kod do którego próbuję znaleźć rozwiązanie jest o wiele bardziej skomplikowany niż to co dałem w przykładzie, modułów mam o wiele więcej i wypisywać wszystkie po przecinku w argumentach nie wydaje mi się dobrym pomysłem. Myslałem bardziej, że istnieje jakaś funkcja albo trick typu include z php. W moim kodzie zrobił się bałagan i chciałem rozdzielić całą zmienną commands do oddzielnego pliku commands.js, ale w commands.js uzywam modulow ktore importuje w innym pliku (w którym też potrzebuje tych modułów). Próbowałem też użyć:
 

eval(fs.readFileSync('commands.js')+'');

Ale efekt jest znikomy. 

Podobne pytania

0 głosów
2 odpowiedzi 305 wizyt
pytanie zadane 10 października 2019 w JavaScript przez BlvckFox Gaduła (4,240 p.)
+1 głos
3 odpowiedzi 109 wizyt
pytanie zadane 23 listopada 2022 w JavaScript przez Nitr0Skay Użytkownik (670 p.)
0 głosów
2 odpowiedzi 160 wizyt
pytanie zadane 29 kwietnia 2017 w PHP przez sapero Gaduła (4,100 p.)

92,568 zapytań

141,424 odpowiedzi

319,634 komentarzy

61,956 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...