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

Problem z modułami w nodeJS

VPS Starter Arubacloud
0 głosów
388 wizyt
pytanie zadane 10 października 2019 w JavaScript przez BlvckFox Gaduła (4,240 p.)

Cześć, mam dwa pliki:
app.js:
 

const api = require('jakies-api');
api.login('login','haslo'){
   module.exports.api = api;
}

test.js:
 

const js = require('./app.js');

js.api.sendMessage("Witam");

I wyświetla mi się błąd "js.api.sendMessage" nie jest funkcją. 
Jak mogę użyć w innym pliku metod z API, które wymaga zalogowania? 

2 odpowiedzi

0 głosów
odpowiedź 10 października 2019 przez Comandeer Guru (604,700 p.)

Problem polega na tym, że domyślnie kod JS jest synchroniczny, więc żeby dostać się do asynchronicznie dodawanego importu, musiałbyś opóźnić wykonywanie kodu w test.js. W przypadku ESM będzie to możliwe przy pomocy tzw. top-level await.

Niemniej proponuję o wiele lepszy i prostszy sposób: w app.js po prostu zwróć funkcję, która będzie wczytywać to API i przekazywać do callbacku, a w test.js opakuj wszystko w tę funkcję:

// app.js
module.exports = function getAPI( callback ) {
    api.login( 'whatever', callback );
};

// test.js
const getAPI = require( './app.js' );

getAPI( function( api ) {
    api.sendMessage( 'Witam' );
} );

 

komentarz 10 października 2019 przez BlvckFox Gaduła (4,240 p.)

Stworzyłem ten taki w realnym przykladzie i logowanie nie wykonuje się wcale, chyba, że zalogować się i dopiero zrobić export z logowaniem.
 

api.login('login','haslo'){
    api.sendMessage("Zalogowano!");
}
module.exports = function getAPI( callback ) {
    api.login( 'login','haslo' );
};

 

komentarz 10 października 2019 przez Comandeer Guru (604,700 p.)

Zacznijmy od tego, że ten kod działa tylko i wyłącznie dlatego, że nawiasy klamrowe są też wyznacznikiem bloku. Zapis

api.login('login','haslo'){
    api.sendMessage("Zalogowano!");
}

nie ma sensu. W pierwszym kodzie po prostu myślałem, że źle zapisałeś funkcję z callbackiem.

Pytanie brzmi, czy api.login jest synchroniczne, czy nie?

komentarz 10 października 2019 przez BlvckFox Gaduła (4,240 p.)

Faktycznie to co napisałem to nie jest identyczny kod, tak wygląda kod którego używam:
 

login = require("facebook-chat-api");

login({email: "x", password: "x"}, (err, api) => {
		/// Kod w ktorym api.X działa
);

W drugim pliku stworzyłem funkcję która o określonej godzinie wysyła wiadomość (korzysta z api.sendMessage)

komentarz 10 października 2019 przez Comandeer Guru (604,700 p.)

No więc tak, jak mówiłem: wyeksportuj funkcję, która będzie przekazywać dalej api:

// app.js
const login = require( 'facebook-chat-api' );

module.exports = function( callback ) {
	login( { email: 'x', password: 'y' }, ( err, api ) => {
		callback( api );
	} );
};

// test.js
const getAPI = require( './app' );

getAPI( function( api ) {
	api.sendMessage( 'Whatever' );
} );

 

komentarz 10 października 2019 przez BlvckFox Gaduła (4,240 p.)
Zrobilem tak i nie dzieje się absolutnie nic: program się włącza, nic nie robi i wyłącza
0 głosów
odpowiedź 10 października 2019 przez Paweł Antyporowicz Stary wyjadacz (11,470 p.)

Tutaj może być problem. Import jest w funkcji zamiast bezpośrednio w pliku:
 

const api = require('jakies-api');
api.login('login','haslo'){

}

module.exports.api = api;

 

Podobne pytania

0 głosów
2 odpowiedzi 366 wizyt
pytanie zadane 24 listopada 2018 w JavaScript przez BlvckFox Gaduła (4,240 p.)
0 głosów
0 odpowiedzi 681 wizyt
+1 głos
0 odpowiedzi 102 wizyt
pytanie zadane 8 września 2020 w JavaScript przez Ditrix Mądrala (5,650 p.)

92,950 zapytań

141,909 odpowiedzi

321,133 komentarzy

62,284 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.

Wprowadzenie do ITsec, tom 2

Można już zamawiać tom 2 książki "Wprowadzenie do bezpieczeństwa IT" - będzie to około 650 stron wiedzy o ITsec (17 rozdziałów, 14 autorów, kolorowy druk).

Planowana premiera: 30.09.2024, zaś planowana wysyłka nastąpi w drugim tygodniu października 2024.

Warto preorderować, tym bardziej, iż mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy dodatkowe 15% zniżki! Dziękujemy zaprzyjaźnionej ekipie Sekuraka za kod dla naszej Społeczności!

...