Как отправить данные из запроса JQuery AJAX на сервер Node.js - программирование
Подтвердить что ты не робот

Как отправить данные из запроса JQuery AJAX на сервер Node.js

Что я хочу сделать:
Просто отправьте некоторые данные (например, json), на http-сервер node.js, используя запросы jQuery ajax.

По какой-то причине я не могу получить данные на сервере, потому что он никогда не запускает событие "данных" запроса.

Клиентский код:

$.ajax({
    url: server,
    dataType: "jsonp",
    data: '{"data": "TEST"}',
    jsonpCallback: 'callback',
    success: function (data) {
        var ret = jQuery.parseJSON(data);
        $('#lblResponse').html(ret.msg);
    },
    error: function (xhr, status, error) {
        console.log('Error: ' + error.message);
        $('#lblResponse').html('Error connecting to the server.');
    }
});

Код сервера:

var http = require('http');
http.createServer(function (req, res) {

    console.log('Request received');

    res.writeHead(200, { 'Content-Type': 'text/plain' });
    req.on('data', function (chunk) {
        console.log('GOT DATA!');
    });
    res.end('callback(\'{\"msg\": \"OK\"}\')');

}).listen(8080, '192.168.0.143');
console.log('Server running at http://192.168.0.143:8080/');

Как я уже сказал, он никогда не попадает в событие "данных" запроса.

Комментарии:
1. Он регистрирует сообщение "Запрос получил",
2. Ответ прекрасен, он способен обрабатывать его на клиенте с данными;

Любая помощь? Я что-то пропустил?

Спасибо всем заблаговременно.

EDIT:
Прокомментировала окончательную версию кода, основываясь на ответе:

Клиентский код:

$.ajax({
type: 'POST' // added,
url: server,
data: '{"data": "TEST"}',
//dataType: 'jsonp' - removed
//jsonpCallback: 'callback' - removed
success: function (data) {
    var ret = jQuery.parseJSON(data);
    $('#lblResponse').html(ret.msg);
},
error: function (xhr, status, error) {
    console.log('Error: ' + error.message);
    $('#lblResponse').html('Error connecting to the server.');
}
});


Код сервера:

var http = require('http');
http.createServer(function (req, res) {

    console.log('Request received');

    res.writeHead(200, { 
        'Content-Type': 'text/plain',
        'Access-Control-Allow-Origin': '*' // implementation of CORS
    });
    req.on('data', function (chunk) {
        console.log('GOT DATA!');
    });

    res.end('{"msg": "OK"}'); // removed the 'callback' stuff

}).listen(8080, '192.168.0.143');
console.log('Server running at http://192.168.0.143:8080/');


Поскольку я хочу разрешить кросс-доменные запросы, я добавил реализацию CORS.

Спасибо!

4b9b3361

Ответ 1

Чтобы получить событие "данных" для запуска на стороне сервера node.js, вы должны ПОСЛАТЬ данные. То есть событие "данные" реагирует только на данные POSTed. Задание "jsonp" в качестве формата данных заставляет GET-запрос, поскольку jsonp определен в документации jquery как:

"jsonp": загрузка в блоке JSON с использованием JSONP. Добавляет дополнительный "? Callback =?" до конца вашего URL-адреса, чтобы указать обратный вызов

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

Клиент:

<html>
<head>
    <script language="javascript" type="text/javascript" src="jquery-1.8.3.min.js"></script>
</head>

<body>
    response here: <p id="lblResponse">fill me in</p>

<script type="text/javascript">
$(document).ready(function() {
    $.ajax({
        url: 'http://192.168.0.143:8080',
        // dataType: "jsonp",
        data: '{"data": "TEST"}',
        type: 'POST',
        jsonpCallback: 'callback', // this is not relevant to the POST anymore
        success: function (data) {
            var ret = jQuery.parseJSON(data);
            $('#lblResponse').html(ret.msg);
            console.log('Success: ')
        },
        error: function (xhr, status, error) {
            console.log('Error: ' + error.message);
            $('#lblResponse').html('Error connecting to the server.');
        },
    });
});
</script>

</body>
</html>

Некоторые полезные строки, которые помогут вам отладить серверную часть:

Сервер:

var http = require('http');
var util = require('util')
http.createServer(function (req, res) {

    console.log('Request received: ');
    util.log(util.inspect(req)) // this line helps you inspect the request so you can see whether the data is in the url (GET) or the req body (POST)
    util.log('Request recieved: \nmethod: ' + req.method + '\nurl: ' + req.url) // this line logs just the method and url

    res.writeHead(200, { 'Content-Type': 'text/plain' });
    req.on('data', function (chunk) {
        console.log('GOT DATA!');
    });
    res.end('callback(\'{\"msg\": \"OK\"}\')');

}).listen(8080);
console.log('Server running on port 8080');

Цель события данных на стороне node состоит в том, чтобы создать тело - он срабатывает несколько раз за один HTTP-запрос, один раз для каждого фрагмента данных, который он получает. Это асинхронный характер node.js - сервер выполняет другую работу между получением блоков данных.