#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 являются экспресс-вызовами и не распознаются в ядре узла.