• 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
281 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 (599,730 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 (599,730 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 (599,730 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 290 wizyt
pytanie zadane 24 listopada 2018 w JavaScript przez BlvckFox Gaduła (4,240 p.)
0 głosów
0 odpowiedzi 479 wizyt
+1 głos
0 odpowiedzi 79 wizyt
pytanie zadane 8 września 2020 w JavaScript przez Ditrix Mądrala (5,650 p.)

92,452 zapytań

141,262 odpowiedzi

319,079 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...