Nodejs 为什么res.jsonp会no method呢?

Nodejs 为什么res.jsonp会no method呢?

错误:500 TypeError: Object #<ServerResponse> has no method 'jsonp’ 需要特别设置吗?

9 回复

Node.js 为什么 res.jsonp 会报 “no method” 错误?

当你在使用 res.jsonp 方法时遇到 TypeError: Object #<ServerResponse> has no method 'jsonp' 错误,这通常意味着你正在使用的 response 对象并没有 jsonp 方法。这是因为默认情况下,Express 框架并不支持 res.jsonp 方法。

原因

res.jsonp 是一个扩展方法,通常需要额外的库或插件来实现。默认情况下,Express 框架并没有内置 jsonp 支持。

解决方案

你可以通过以下几种方式解决这个问题:

  1. 安装 express-jsonp 插件

    首先,你需要安装 express-jsonp 插件,然后在你的 Express 应用中使用它。

    npm install express-jsonp --save
    

    然后,在你的应用中使用这个插件:

    const express = require('express');
    const jsonp = require('express-jsonp');
    
    const app = express();
    
    // 使用 jsonp 中间件
    app.use(jsonp());
    
    app.get('/', (req, res) => {
        res.jsonp({ message: 'Hello, world!' });
    });
    
    app.listen(3000, () => {
        console.log('App is running on port 3000');
    });
    
  2. 手动实现 jsonp 方法

    如果你不想安装额外的库,也可以手动实现 jsonp 方法。以下是一个简单的示例:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
        const data = { message: 'Hello, world!' };
        const callback = req.query.callback;
    
        if (callback) {
            res.set('Content-Type', 'application/javascript');
            res.send(`${callback}(${JSON.stringify(data)})`);
        } else {
            res.json(data);
        }
    });
    
    app.listen(3000, () => {
        console.log('App is running on port 3000');
    });
    

在这个示例中,我们检查请求是否包含 callback 参数。如果有,我们将数据包装在回调函数中,并设置响应类型为 application/javascript。如果没有 callback 参数,则直接返回 JSON 数据。

通过以上方法,你可以解决 res.jsonp 报错的问题,并正确地处理 JSONP 请求。


神了,直接res.json居然可以达到jsonp的效果,只要url中有callback,但res.jsonp报错

你使用了jsonp,就应该去查询一下jsonp是做什么的,怎么用以及相关的资料文献。简单的说,json是回传的一个js存储对象,那么jsonp就是一个可执行的对象,前提是跨域2端提前通信好,将哪个函数作为通信函数。例如:

        var a = {"num":1};//后台给服务器传递一个参数num=1
        var params = qs.parse(url.parse(req.url).query);//前端的参数
	res.writeHead(200, {"Content-Type": "text/javascript"});
	res.write(params['jsoncallback']+'('+JSON.stringify(a)+')');//关键就是这段,下面来做解释
	res.end();

你可以仔细研读jquery关于jsonp的说明,或者阅读更多的文献来补充自己,我这里只做简单的以上代码解释。jsonp是用于跨域请求,一般来说,跨域不能通信,但是要通信怎么办,除非2个域认识,前端(域A)和后台(域B),如果A和B认识,那么A传递给B的信息B一定是知道的。那么就简单了,A在发出请求的时候,告诉B调用哪个jsoncallback即可。由于B是知道A会告诉他调用哪个,因此程序里就直接获取参数里面的jsoncallback对应的函数,然后嵌入自己给他的参数。这段关键的代码在B那里是文本写入,但是传到了A那里就直接可执行了。执行的结果,就是他想要知道的结果。

呵呵,感谢回复这么长篇,我想你误会我的意思了,可能是我没讲清楚,JSON和JSONP我清楚。 我的意思是,从express的官方接口,如果要输出JSONP,可以直接用res.jsonp(data)的方式输出。但我用res.jsonp报错,用res.json则没问题,而且当url中包括callback参数时,res.json会自动输出为jsonp的格式。 一句话说,server-side用res.jsonp会报500错误,但官方api是有这个函数的。

官方上的例子

res.jsonp([status|body], [body])

Send a JSON response with JSONP support. This method is identical to res.json() however opts-in to JSONP callback support.

res.jsonp(null)

// => null

res.jsonp({ user: ‘tobi’ })

// => { “user”: “tobi” }

res.jsonp(500, { error: ‘message’ })

// => { “error”: “message” }

//By default the JSONP callback name is simply callback, however you may alter this with the jsonp callback name setting. The following are some examples of JSONP responses using the same code:

// ?callback=foo

res.jsonp({ user: ‘tobi’ })

// => foo({ “user”: “tobi” })

app.set(‘jsonp callback name’, ‘cb’);

// ?cb=foo

res.jsonp(500, { error: ‘message’ })

// => foo({ “error”: “message” })

那你就要查看版本问题了,有可能你下的版本是2.x,然后查看的api又是3.x的

hi,楼主你的jsonp的这个问题解决了吗?

app.set(‘jsonp callback name’, ‘cb’);这个代码用上了吗?

解释

res.jsonp 方法并不是 Node.js 内置模块 httpexpress 的默认方法。它通常是通过一些库(如 express)或中间件添加到响应对象上的。如果你直接使用原生的 Node.js 模块来创建 HTTP 服务器,可能会遇到 TypeError: Object #<ServerResponse> has no method 'jsonp' 错误。

示例代码

为了正确使用 res.jsonp 方法,你需要使用 express 框架,并确保你已经安装了 expressbody-parser 中间件。

  1. 安装依赖

    npm install express body-parser
    
  2. 示例代码

    const express = require('express');
    const app = express();
    
    app.get('/api/data', (req, res) => {
        const data = { message: "Hello, world!" };
        res.jsonp(data); // 使用 jsonp 方法
    });
    
    app.listen(3000, () => {
        console.log('Server is running on port 3000');
    });
    

在这个例子中,我们创建了一个简单的 Express 应用,并定义了一个路由 /api/data。当请求这个路由时,服务器将返回 JSONP 数据。

如果你仍然遇到问题

  1. 确保你已经在项目中安装了 express
  2. 确保你没有重写或覆盖 response 对象上的方法。
  3. 检查你的代码逻辑,确保你在正确的上下文中调用了 res.jsonp

通过这些步骤,你应该能够解决 res.jsonp 方法未找到的问题。

回到顶部