• 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

Aruba Cloud PRO i VPS, Openstack, VMWare, MS Hyper-V
0 głosów
133 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 (582,760 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 (582,760 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 (582,760 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 131 wizyt
pytanie zadane 24 listopada 2018 w JavaScript przez BlvckFox Gaduła (4,240 p.)
0 głosów
0 odpowiedzi 143 wizyt
+1 głos
0 odpowiedzi 52 wizyt
pytanie zadane 8 września 2020 w JavaScript przez Ditrix Mądrala (5,650 p.)

90,303 zapytań

138,899 odpowiedzi

311,088 komentarzy

60,017 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...