1

我在我的 node.js 函数中使用 JSONP:

this.send(JSON.stringify({
    type: 'hello',
    username: this.data('username'),
    friends: friends
}));

但是,它给了我一个意外的令牌“:”错误(我在 json 中看不到)。阅读这篇文章后:'Uncaught SyntaxError: Unexpected token :' in jsonp

我发现这可能是一个 json/jsonp 问题。所以我将代码更改为:

this.jsonp(JSON.stringify({
    type: 'hello',
    username: this.data('username'),
    friends: friends
}));

但是,它说这没有方法“jsonp”。我也不能使用发送,因为我在客户端使用 jsonp。这很奇怪,因为除了这里,我可以在其他任何地方使用 jsonp。以下是 user.js 文件中的一些函数。

User.prototype.send = function(code, message, callback) {
    this._send('listener', code, message, callback);
};

User.prototype._send = function(type, code, message, callback) {
    if(!message && typeof code != 'number') {
        callback = message;
        message = code;
        code = 200;
    }

    if(typeof message != 'string')
        message = JSON.stringify(message);

    if(type == 'connection' && this.connection) {
        this.connection.writeHead(code || 200, {
            'Content-Type': 'application/json',
            'Content-Length': message.length
        });
        this.connection.end(message);
    } else {
        if(!this.listeners.length)
            return this.message_queue.push(arguments);

        var cx = this.listeners.slice(), conn;
        this.listeners = [];
        while(conn = cx.shift()) {
            conn.writeHead(code || 200, {
                'Content-Type': 'application/json',
                'Content-Length': message.length
            });
            conn.end(message);
        }
        if(callback) callback();
    }
};

看起来它正在调用内部的发送函数,但是,我找不到将这个 json 更改为 jsonp 的位置,因此它不会在客户端抛出意外的令牌错误。(现在它自从 json 和 jsonp 问题) .

4

1 回答 1

1

我认为您误解了 jsonp 是什么。它不是一个可以绕过同源策略的神奇 ajax。它适用于这样的浏览器:

  1. 获取jsonp数据的url。
  2. 创建一个处理 jsonp 数据的函数。
  3. 将函数名称作为参数附加到 jsonp url。
  4. 在 DOM 中使用该 url 的 src 属性创建一个脚本标记。
  5. jsonp 服务器看到有一个请求进来,并将 json 数据包装在对函数参数的调用中。
  6. 该脚本加载到您的页面上并执行该功能。

尽管 jQuery 和其他一些框架使这个看起来像一个 XMLHttpRequest,但它远非如此。

仅仅因为您必须在客户端使用 jsonp 并不意味着您必须在 node.js 中使用它。您是否查看过外部服务器的 API 并确保您已尝试创建正确的 GET、PUT 或 POST 请求?

于 2013-10-02T20:12:34.153 回答