Опубликовать в nodejs и вернуть результаты

#node.js #cross-domain #jsonp #jquery-post

#node.js #междоменный #jsonp #jquery-post

Вопрос:

Я часами искал в Google, чтобы отправить сообщение с моего клиентского js, размещенного на моем сайте, на сервер nodejs, чем возвращать эти результаты обратно на мою клиентскую сторону.

Это пример того, чего я пытаюсь достичь:

 <html>
<head>
<script type="text/javascript">
var my_id = <?=$myuserid;?>;
$(function(){
    $.ajax({
        url: 'http://mydomain.com:8001/get_friends',
        dataType: 'JSONP',
        type: 'POST',
        crossDomain: true,
        data: {
            id: my_id
        },
        success: function(data){
            if(data.error===true){
                alert(data.msg);
            } else {
                alert(data.users);
            }
        }
    });
});
</script>
</head>
<body>
</body>
</html>
  

Чем файл NodeJS:

 var http = require('http'),
    url = require('url'),
    mysql = require('mysql'),
    sys = require('sys');
var client = mysql.createClient({
    user: 'root',
    password: 'password',
});

http.createServer(function(request, response){
    client.query('USE mydatabase');
    client.query(
        'SELECT * FROM buddy_list WHERE user_id = "This is where I need my post to go"',
        function selectCb(err, results, fields){
            if(err){
                throw err;
            }
            response.writeHead(200, { 'Content-Type' : 'application/json' });
            "Here I need it to feed back results to client script."
            response.end();
            client.end();
    })
}).listen(8001);
  

Ответ №1:

Помимо проблем с очисткой ввода, вот как вы могли бы решить эту проблему:

 http.createServer(function(request, response){
    request.on('data', function(chunk) {
        dataInput = chunk.toString();
        client.query('USE mydatabase');
        client.query(
            'SELECT * FROM buddy_list WHERE user_id = '   dataInput,
            function selectCb(err, results, fields){
                if(err){
                    throw err;
                }
                response.writeHead(200, { 'Content-Type' : 'application/json' });
                "Here I need it to feed back results to client script."
                response.end();
                client.end();
        })

    })
}).listen(8001);
  

Комментарии:

1. Есть ли способ получить эти результаты на сервере на стороне клиента?

2. У меня нет опыта работы с соединителем mysql для nodejs, но я бы предположил, что вы могли бы заменить response.end(); строку на response.end({'results': results}); . Моим советом было бы засорять ваш код консолью. регистрируйте инструкции, чтобы получить лучшее представление о том, что происходит, и когда это происходит, и в каком формате оказываются данные. Однако, когда у вас есть данные для отправки обратно клиенту, вставьте их в качестве единственного аргумента внутри response.end(argument) .

3. Извините, похоже, я не могу отредактировать свой комментарий выше, но заменить response.end({'results': results}); на response.end(JSON.stringify({'results': results})); . Моя ошибка.

4. Я смог заставить его отображать результаты, если я делаю прямую публикацию в скрипте, но по какой-то причине выполнение ajax post со стороны моего клиента ничего не возвращает. Это мелочь, которую я пытался выяснить. Все остальное, хотя и работает отлично.

5. Это предполагает, что фрагмент не очень большой и, следовательно, должен быть выполнен после первого вызова. Что делать, если у вас большой файл Json? Вы должны использовать a req.on('end', func ... ) для решения проблемы и отправки ответа в конце с res.end()

Ответ №2:

 response.writeHead(200, { 'Content-Type' : 'application/json' });
response.send( JSON.stringify(results) );
  

Я не пробовал это, но это похоже на то, что вы хотите. Я не уверен, какие результаты, поля есть или нужно ли больше манипулировать данными. Я предполагаю, что «результаты» — это объект JSON.

Комментарии:

1. почему бы просто res.json(results)

2. res.json и res.send являются экспресс-вызовами и не распознаются в ядре узла.