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?
Что мне приходи в голову:
Запустить вторую ноду? на другом порту? это как то глупо. Плюс, с CORS надо будет бороться, наверное
сказать ноде что то магическое, чтобы она понимала, что у неё сервер состоит из ДВУХ 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 шт):
Уважаемый 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