Hosting MyDevil - Deployment aplikacji w Express i React

0

Cześć. Zrobiłem aplikację w Reakcie z małym backendem - plikiem servera i modułem mail, który odpowiada za wysyłanie maila z formularza na stronie. Na Heroku cała aplikacja działała bez zarzutu. Wczoraj wrzuciłem tę stronę na MyDevil i nie działa mi backend. Frontend w całości działa prawidłowo. Zrobiłem więc testowy endpoint /get w pliku server.js, z którym łączy się Axios z Reacta, następnie endpoint z server.js odpowiada poprzez res.json("test"). Niestety React nie drukuje tego "test" w konsoli, tylko jakieś "hello world", którego nie mam nigdzie w projekcie. Zauważyłem, że na Heroku, gdy wejdę w trybie developerskim w zakładce sieć, to przy wspomnianym gecie "test", pojawia się w typie "json", a na MyDevil pojawia się "plain". Na MyDevil status tego geta to co prawda 200, ale wydaje mi się, że nie ma to nic wspólnego z moim plikiem server.js, bo nawet gdy zrobię pusty plik app.js w root projektu, to status ma 200. Nie mam zielonego pojęcia jak poustawiać cały ten projekt na MyDevil, dokumentacja jest dla mnie mało zrozumiała, a support też nie potrafi mi pomóc. Pewnie dlatego, że jestem kompletnie zielony w tym temacie, do tej pory uczyłem się tylko frontu i podstaw backendu, nie jestem po studiach informatycznych i nie znam się na sysadminowych sprawach, nawet deployment na Heroku był dla mnie dużym wyzwaniem. Próbowałem różnych rzeczy: zmieniałem nazwę servera na app.js, tak jak zalecali, instalowałem wszystkie backendowe dependencies z wiersza poleceń MyDevil, ale wszystko robię po omacku i nie wiem czy to ma jakikolwiek sens, za każdym razem zero jakiegokolwiek efektu.

Tu jest kod z Heroku, który dobrze działał.

To jest endpoint z pliku server.js:

app.get("/test", (req, res) => {
res.json("test");
});

To część frontendowa endpointa:

axios
     .get("/test")
     .then(function (response) {
       console.log(response.data);
     })
     .catch(function (error) {
       console.log("error");
     });

Posiłkowałem się dokumentacją stąd - https://wiki.mydevil.net/Node.js
Włączyłem wiersz poleceń przez program Putty, zalogowałem się i wpisałem tam to wszystko co jest w dokumentacji we wstępnej konfiguracji i "wersje node.js". Nie wiem, czy to się "przyjęło". Jak wpisuję w wierszu node -v to pokazuje mi 6.17.1, zamiast 12, którą niby ustawiłem. Wpisałem też w wiersz to co jest w "moduły", mimo że jest to dla mnie niezrozumiałe. Gdy w wierszu poleceń będąc w folderze public_nodejs wpisuję npm install to wyskakuje mi:

npm ERR! code EJSONPARSE
npm ERR! file /usr/home/Vyost/domains/mitroinc.pl/public_nodejs/package.json
npm ERR! JSON.parse Failed to parse json
npm ERR! JSON.parse Unexpected token h in JSON at position 4 while parsing near '{
npm ERR! JSON.parse homepage: "http://mi...'
npm ERR! JSON.parse Failed to parse package.json data.
npm ERR! JSON.parse package.json must be actual JSON, not just JavaScript.

Więc instalowałem po kolei np. npm install express. Nie wiem czy powinienem instalować package z clienta, ale skoro frontend działa, to znaczy, że chyba samo się zainstalowało? Bardzo Was proszę, powiedzcie mi co mam po kolei zrobić, żeby backend zaczął mi działać. Zrobiłem w Reakcie build i wrzuciłem jego zawartość do folderu public w folderze public_nodejs. Nie mam pojęcia jak podłączyć do tego backend, już chyba z 10 godzin próbuję. Na Heroku wrzucałem specjalny kod do server.js i zmieniałem różne rzeczy w package.json, żeby odpalić aplikację, a tutaj nie mogę znaleźć żadnych informacji, które bym zrozumiał. Nie wiem, które pliki mam wrzucać i do których folderów.
Adres strony to www.mitroinc.pl. Domena jest na OVH, wstawiłem tam dnsy z MyDevil, potem w panelu MyDevil w zakładce "strony www" dodałem mitroinc.pl, w "strefach dns" też dodałem ten adres i nic tam w środku nie zmieniałem. Zaznaczyłem, że ta aplikacja jest w node.js. Opisałem to wszystko najbardziej szczegółowo jak się dało.

0

Update:

Udało mi się częściowo aktywować backend, dzięki pomocy supportu z MyDevil, który pomógł mi właściwie ustawić wersję node w CLI, bo coś tam pewnie źle przepisałem przy konfiguracji, chyba zrobiłem gdzieś niepotrzebny folder. Testowy endpoint bezpośrednio w pliku serwerowym app.js działa poprawnie:

backend (fragment kodu z app.js) :

 app.get("/test", (req, res) => {
    res.json("test");
 });

frontend:

 axios
    .get("/test")
    .then(function (response) {
       console.log(response.data);
   })
   .catch(function (error) {
      console.log("error");
    });

Ale poniższy endpoint, który znajduje się w ścieżce routes/api/abc.route.js daje błąd 404, a konsola zamiast "test2" drukuje error. W pliku app.js wskazałem na niego w ten sposób:


 const abcRouter = require("./routes/api/abc.route");

 app.use("/routes/api/", abcRouter);

backend:

 const express = require("express");
 const router = express.Router();
 
 router.route("/test2").get((req, res) => {
   res.json("test2")
 });

 module.exports = router;

frontend:

 axios
    .get("/routes/api/test2")
    .then(function (response) {
       console.log(response.data);
    })
    .catch(function (error) {
       console.log("error");
    });

Co może być tego przyczyną? Oba frontendowe "axiosy" są w tym samym pliku, jeden pod drugim. Próbowałem dopisywać .js w ścieżce do pliku, zmieniałem nazwy plików na inne i ich lokalizacje. Mój cały plik serwerowy app.js:

const express = require("express");
const cors = require("cors");
const path = require("path");
const sendMail = require("./mail");
const def = require("./def.js");
const { log } = console;
const app = express();
const compression = require("compression");

app.use(compression());
app.use(cors());

// Data parsing
app.use(
  express.urlencoded({
    extended: false,
  })
);
app.use(express.json());

// Nodemailer
app.post("/email", (req, res) => {
  const { subject, email, text } = req.body;
  log("Data: ", req.body);

  sendMail(email, subject, text, function (err, data) {
    if (err) {
      log("ERROR: ", err);
      return res.status(500).json({ message: err.message || "Internal Error" });
    }
    log("Email sent!!!");
    return res.json({ message: "Email sent!!!!!" });
  });
});
app.get("/test", (req, res) => {
  res.json("testt")
});

  
const abcRouter = require("./routes/api/abc-route.js");
  const defRouter = require("./def.js");

app.use("/routes/api/", abcRouter);
  app.use("/", defRouter);

  
app.use(express.static("public"));

  app.get("/", (req, res) => {
    res.sendFile(path.resolve(__dirname, "public", "index.html"));
  });

app.listen(12476);

Słabo znam się na backendzie, ale na Heroku wszystkie testowe gety działają poprawnie. Zastanawiam się czy to nie ma związku z ngixem, którego nie ma na Heroku, ale o ngixie nic nie wiem. Zrobiłem też kolejny testowy route jako plik "def.js", tym razem w folderze głównym, ale też nie działa.

1 użytkowników online, w tym zalogowanych: 0, gości: 1