错误:500 TypeError: Object #<ServerResponse> has no method ‘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" })
@romboo 那这种问题就没必要纠结,有可能是官方写了这个api还没有实现,我在用mongoose的时候遇到的问题跟你很类似,doc有toJSON和toObject方法,但是docs在他的最新的版本里都没有,api里却写了。你可以提交你的问题给官方,或者查看模块代码里是否有这个方法。