node js: нужен ли запуск ДВУХ нод, чтобы сделать form action?

Господа, я только начал осваивать nodejs. Использую node и express.

Написал первую страницу - статический html файл, котрый должен содержимое textarea отправить на сервер.

Сейчас мой файл form1.html выглядит так:

    <!DOCTYPE html>
    <head></head>
    <body>
        <form action="loaddata.js" method="post">
            <p><b>Введите текст:</b></p>
            <p><textarea rows="25" cols="95" name="text"></textarea></p>
            <p><input type="submit" value="Отправить"></p>
          </form>
    </body>
    </html>

Написал "запускалку" - файл server.js, который при помощи express'а хостит статические файлы, находящиеся в директории public:

    const express        = require('express');

    const app = express()

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

    const port = 3000

    app.get('/', (req, res) => {
      res.send('Hello World!')
    })

    app.listen(port, () => {
      console.log(`Example app listening at http://localhost:${port}`)
    })

И задумался: вот я запускаю сервер командой node server.js. Захожу в браузер, и вижу по адресу http://127.0.0.1:3000/form1.html свою прекрасную форму с одной кнопкой.

А как теперь сделать, чтобы при нажатии кнопки на самом деле в node.js отрабатывал файл loaddata.js?

Что мне приходи в голову:

  1. Запустить вторую ноду? на другом порту? это как то глупо. Плюс, с CORS надо будет бороться, наверное

  2. сказать ноде что то магическое, чтобы она понимала, что у неё сервер состоит из ДВУХ js - файлов, и в случае обращения к URL http://127.0.0.1:3000/loaddata.js надо на самом деле запустить файл loaddata.js

Но что ей нужно сказать? файл loaddata.js у меня есть, в нём написано console.log("Hi! from loaddata.js");, но при попытке запостить форму я получаю сообщение Cannot POST /loaddata.js


Ответы (1 шт):

Автор решения: S.H.

Уважаемый entithat, большое спасибо, фактически на мой вопрос ответили Вы в комментариях, и я добавляю свой ответ только для полноты картины.

Итак, первое "хождение в ноду" оказалось забавным.

Мне помогло несколько источников информации, и понимание того, как та же задача решается при помощи других инструментов.

Окончательный варинат скрипта выглядит так:

Клиент: (файл public/form1.html)

    <!DOCTYPE html>
    <head></head>
    <body>
        <form action="form" method="post">
            <p><b>Введите текст:</b></p>
            <p><textarea rows="25" cols="95" name="text"></textarea></p>
            <p><input type="submit" value="Отправить"></p>
          </form>
    </body>
    </html>

Сервер: (файл server.js)

    const express = require('express');
    const bodyParser = require("body-parser");
    fs = require('fs');

    const app = express()

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

    const port = 3000

    app.get('/', (req, res) => {
      res.send('Hello World!')
    })

    // создаем парсер для данных application/x-www-form-urlencoded
    const urlencodedParser = bodyParser.urlencoded({extended: false});

    app.post('/form', urlencodedParser, function (req, res) {
      console.log("Hi from POST handler");
      console.log(req.body.text);
      fs.writeFile('msg.txt', req.body.text, function (err){});
      res.send('POST request to the homepage');
    });

    app.listen(port, () => {
      console.log(`Example app listening at http://localhost:${port}`)
    })

Для полноты картины - файл package.json:

{
  "name": "notable",
  "version": "1.0.0",
  "description": "",
  "main": "server.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}

Как видите, сервер принимает текстовое поле и запихивает его в файл. Запуск: node server.js

→ Ссылка