Отправка данных из файла javascript клиента в файл javascript сервера (node.js или другой) и получение ответа обратно

TL; DR: как я могу отправить данные из клиентского javascript в файл javascript на стороне сервера (node.js или любой другой), получить их там (и кое-что с этим сделать), а затем отправить обратно в файл javascript на стороне клиента для дальнейшего использования?

Полное описание проблемы

Существует HTML-страница с формой, из которой myjavascript.js собирает пользовательский ввод и обрабатывает его на стороне клиента (используя FormData). Затем myjavascript.js отправляет обработанные данные в myphp.php (на стороне сервера) следующим образом:

myjavascript.js:

ajax = new XMLHttpRequest();
ajax.open("POST", "../../myphp.php",false);
ajax.send(formdata);
return ajax.responseText;

Данные (formdata) затем принимаются myphp.php , подвергаются дальнейшей обработке, а затем отправляются обратно в myjavascript.js : ..

myphp.php:

$fieldOne = $_POST["fieldOne"];
$fieldTwo = $_POST["fieldTwo"];
...
($fieldOne, $fieldTwo etc. are processed, and the result is assigned to $results)
...
echo json_encode($results);
exit();

... где он возвращается return ajax.responseText; (как в коде myjavascript.js выше). И тогда эти данные отображаются на странице HTML и т. Д.

Вопрос

Я делал это раньше. Теперь я хотел бы использовать javascript на стороне сервера (скажем, myserver.js ) вместо myphp.php . У меня есть код для обработки данных в myserver.js , я просто не понимаю, как получить данные из myjavascript.js и отправить ответ обратно. Возможно ли, и если да, то как должен выглядеть код для него? Вообще, я не совсем понимаю, чем механизм получения данных POST в javascript на стороне сервера (и отправки ответа обратно) отличается от PHP. Спасибо за любые предложения и комментарии.

Всего 2 ответа


Вам нужно использовать узел js и выражение js, чтобы вы могли легко достичь своей цели.

Выполните следующие команды после установленного узла js:

$ npm install express --save

$ npm install body-parser --save

myserver.js

const express = require('express')
const app = express()
const port = 3000

const bodyParser = require('body-parser')

app.use( bodyParser.json() )
app.use(bodyParser.urlencoded({
    extended: true
}))

app.get('/', function (req, res) {
    console.log(req.body.fieldOne)
    console.log(req.body.fieldTwo)

    res.send('Hello World!')
})

app.listen(port, () => console.log(`Example app listening on port ${port}!`))

А затем запустите ваш сервер с помощью команды ниже:

$ node myserver.js

В PHP часть веб-сервера обычно реализуется какой-то другой средой, и ваши PHP-скрипты вызываются этой средой. Например, модуль Apache может вызвать ваш веб-запрос сценария /blah.php для /blah.php . Это означает, что разработчики PHP часто думают с точки зрения браузера, вызывающего файл PHP, но на самом деле это сложнее, чем за кулисами.

Типичная настройка Node.js, напротив, заключается в том, что сам код JavaScript реализует прослушиватель веб-сервера. Вы подключаетесь к JS-скрипту вашего сервера, и этот скрипт запускает сервер. Например, встроенный модуль http позволяет реализовать низкоуровневый прослушиватель HTTP с помощью createServer :

const { createServer } = require('http');
const { once } = require('events');

const server = createServer(async (req, res) => {
  const chunks = [];
  req.on('data', chunk => chunks.push(chunk));
  await once(req, 'end');

  const body = JSON.parse(chunks.join(''));

  // Do stuff with the body

  res.statusCode = 200;
  res.end('Success!');
});
server.listen(8080);
console.log('Server is listening at http://0.0.0.0:8080/');

В общем, перестаньте думать с точки зрения клиентского JavaScript-файла, отправляющего вещи в серверный JavaScript-файл, и думайте с точки зрения того, что ваш браузер отправляет HTTP-запрос на ваш HTTP-сервер.

Я бы порекомендовал вам вместо этого использовать инфраструктуру, такую ​​как express или koa для построения вашего сервера, поскольку она позволяет вам более легко настраивать обработку запросов для конкретного маршрута, и у них есть возможность использовать предварительно созданные промежуточные программы для выполнения таких общих задач, как Разбор тела JSON и многое другое.


Есть идеи?

10000