• 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

Object Storage Arubacloud
0 głosów
293 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 (600,390 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 (600,390 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 (600,390 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 316 wizyt
pytanie zadane 24 listopada 2018 w JavaScript przez BlvckFox Gaduła (4,240 p.)
0 głosów
0 odpowiedzi 507 wizyt
+1 głos
0 odpowiedzi 80 wizyt
pytanie zadane 8 września 2020 w JavaScript przez Ditrix Mądrala (5,650 p.)

92,536 zapytań

141,377 odpowiedzi

319,452 komentarzy

61,922 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!

...