如何在node.js express中使用jsonp

21

我正在尝试使用node.js制作三星智能电视应用程序。

在我的项目中,我希望让我的应用程序与服务器PC进行通信。

根据许多网站的说法,我可以使用"jsonp"来实现这一点。

这是我找到的客户端代码。

<html>
<head>
    <title>jsonp test</title>
    <script src="http://code.jquery.com/jquery-1.6.2.min.js"></script>      
    <script type="text/javascript">
        $(function(){               
            $('#select_link').click(function(e){
                e.preventDefault();
                console.log('select_link clicked');

                function test(data){
                    return {"message":"ok"};
                }

                 $.ajax({
                    dataType: 'jsonp',
                    data: "data=yeah",                      
                    jsonp: 'callback',
                    url: 'http://172.20.10.3:3000/endpoint?callback=?',                     
                    success: function(data) {
                        console.log('success');
                        console.log(JSON.stringify(data));
                    }
                });
            });             
        });
    </script>
</head>
<body>
    <div id="select_div"><a href="#" id="select_link">Test</a></div>    
</body>

这里是我找到的服务器端代码。

app.get('/endpoint', function(req, res){
var obj = {};
obj.title = 'title';
obj.data = 'data';

console.log('params: ' + JSON.stringify(req.params));
console.log('body: ' + JSON.stringify(req.body));
console.log('query: ' + JSON.stringify(req.query));

res.header('Content-type','application/json');
res.header('Charset','utf8');
res.send(req.query.callback + '('+ JSON.stringify(obj) + ');');
});

这些代码在我的电脑(服务器电脑)上可以运行,但是当我在其他电脑上打开客户端页面时,它就不能工作。

控制台只会给我显示这个日志:

 X GET http://172.30.2.2:3000/endpoint?callback=jQuery11020685203080996871_1376482492523&data=yeah&_=1376482492524  

我想使用jsonp来处理跨域问题,但似乎不起作用...

我该怎么办才能解决这个问题?

请帮帮我!!


1
你确定另一个人的计算机可以访问你的计算机吗?(在同一网络上,可以ping通等等。) - arghbleargh
@arghbleargh 感谢您的评论!我已经检查过了,其他人可以访问我的服务器... - newbeeep
尝试查看网络检查器并查看请求和响应。 - arghbleargh
2个回答

53

只需使用

res.jsonp(obj)

你可以查看ExpressJS JSONP获得更多信息。


在Express中,是否可以通过$.getJSON来接收JSON响应并在同一页上进行处理?使用response.jsonp会在新页面中呈现结果。 - user2290820
不清楚你想做什么。能否请你将其作为问题与详细信息发布@user2290820? - Nur Rony
这是一个关于编程的问题:https://stackoverflow.com/questions/31891606/receive-ajax-post-back-on-client-from-express-without-reload - user2290820

5
尝试替换 res.send(req.query.callback + '('+ JSON.stringify(obj) + ');');
res.jsonp(req.query.callback + '('+ JSON.stringify(obj) + ');');

8
如果你使用res.jsonp(),我认为你不需要将对象转换为字符串并用回调函数包装它。 - rob
1
这不安全,因为您可以通过callback URL参数进行脚本注入。您需要先使用js-string-escape对回调参数值进行转义:https://www.npmjs.com/package/js-string-escape - Nicolas Garnier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接