Вызов JSONP с использованием языка на стороне сервера в виде Javascript - PullRequest
1 голос
/ 18 июля 2011

Я пытался использовать JSONP для получения объекта JSON с сервера через вызов на стороне клиента (через другой порт). Однако, поскольку мой сервер реализован в javascript с использованием Node.js и Express, я не смог найти много информации о JSONP с Javascript на сервере, так как большинство сайтов, которые я обнаружил, использовали php для серверного кода.

Я полагаю, что проблема заключается в том, как я настраиваю URL в отношении обратного вызова, на что я немного неясен, потому что это плохо для меня.

На сервере:

//Setting up server stuff
var express = require('express'),
  app = express.createServer();
  app.use(express.logger());

//Making a connection to the mongoDB to get the data that I want to display in the JSON object
new Db('prism', 
   new Server("127.0.0.1", 27017, {auto_reconnect: false}), {}).open(function(err, db) {
   app.get('/getData', function(req, res) {
      console.log('JSONPCALLBACK CALLED WITH RETURNDATA PASSED IN; SERVER SIDE');
        if (typeof callback == 'function') {
        console.log('callback is defined');
        callback(returnData);
      }
      else {
        console.log('callback is not defined');
      }
   }
});

А на клиенте:

$.ajaxSetup({ cache : false });
$.getJSON('http://127.0.0.1:1337/getData&callback=?', function(rtndata) {
  console.log('SUCCESS');
  console.log(rtndata);
 });

, встроенный в стандартные теги.

Но я получаю ошибку:

GET http://127.0.0.1:1337/getData&callback=jQuery16108897686484269798_1311007334273?_=1311007334342 404 (Not Found)

Сервер находится на порту 1337, а клиент работает через MAMP на localhost: 8888. Я не уверен, что это даже проблема, связанная с локальным хостом, поскольку я пытался запустить эту настройку в течение нескольких дней.

Я полагаю, что проблема связана с тем, что я не записал эту строку, написанную на php, в мой серверный Javascript. Большинство примеров JSONP, которые я нашел, имели что-то вроде этого. Но я не уверен.

if ($GET['callback'] != '') 
   $json = $GET['callback']."( $json )";
   return $json;

Любая помощь будет принята с благодарностью. Я заранее прошу прощения за то, что я был очень многословен.

Bests, Цун

Ответы [ 3 ]

1 голос
/ 18 июля 2011

Я думаю, у тебя две проблемы.Во-первых, это 404. Полностью отделенный от того, чтобы заставить работать код jQuery на стороне клиента, вам нужно убедиться, что вы можете выполнить обычный запрос браузера (т.е. вставить в этот URL-адрес) и получить то, что вы ожидаете.Я не использовал экспресс, поэтому мне сложно комментировать, почему вы получаете это, за исключением того, что я не вижу 1337 нигде в вашем коде на стороне сервера, только то, что кажется номером порта 27017.

Вторая проблема заключается в том, что вы на самом деле не хотите выполнять обратный вызов на сервере, просто создайте ответ JSON, включая обратный вызов (строку) с префиксом к нему.

Так что вместо этого ...

  if (typeof callback == 'function') {
    console.log('callback is defined');
    callback(returnData);
  }
  else {
    console.log('callback is not defined');
  }

попробуйте это:

  if (callback) {
    console.log('callback is defined');
    res.write(callback + '(' + JSON.stringify(returnData) + ')');
  }
  else {
    console.log('callback is not defined');
  }

Надеюсь, это поможет!

0 голосов
/ 05 декабря 2012

Используйте это:

var express = require("express");
var server = express.createServer();
server.enable("jsonp callback");
server.get("/foo", function(req, res) {
    // this is important - you must use Response.json()
    res.json("hello");
});

jsonp с node.js express

0 голосов
/ 12 сентября 2012

С http://api.jquery.com/jQuery.getJSON/ есть пример, который включает 2 '?'в URL.

у вас есть только один, поэтому попробуйте

$.getJSON('http://127.0.0.1:1337/getData?callback=?', function(rtndata) {

и посмотрите, избавится ли он от вашего 404, а затем посмотрите предложение @jimbojw для возврата правильного ответа в формате jsonp.

...