HI 各位大大早 我目前在学node 遇到这个情况 //MsgObj.js
var MsgObj = function(name){
this.name = name;
}
MsgObj.prototype.toJSON=function(){
return JSON.stringify(this);
}
module.exports = MsgObj ;
//main.js var MsgObj = require("MsgObj ");
var mo = new MsgObj(“123”);
…XXXXX 我在调用resopnes.end(mo.toJSON);—这里修正一下 我原本调用的是 resopnes.end(mo.toJSON());
会提示 http 数据传入 不准确 之类的信息
我将 toJSON修改
MsgObj.prototype.toJSON=function(){
return “abc”
}
就是正确的 在家玩的时候出错的。现在在上班 不能copy报错信息
请问这个是什么问题?
------新增报错信息 我刚刚自己新建了工程 试了下
server listen 9000
/Users/ccboby/Desktop/nodeprojects/test/MsgObj.js:6
return JSON.stringify(this);
^
RangeError: Maximum call stack size exceeded
下面是 return {"a":"123"};
的报错此信息
ccboby:test ccboby$ node app.js
server listen 9000
http.js:851
throw new TypeError('first argument must be a string or Buffer');
^
TypeError: first argument must be a string or Buffer
at ServerResponse.OutgoingMessage.write (http.js:851:11)
at ServerResponse.OutgoingMessage.end (http.js:981:16)
at Server.<anonymous> (/Users/ccboby/Desktop/nodeprojects/test/app.js:6:6)
at Server.emit (events.js:98:17)
at HTTPParser.parser.onIncoming (http.js:2108:12)
at HTTPParser.parserOnHeadersComplete [as onHeadersComplete] (http.js:121:23)
at Socket.socket.ondata (http.js:1966:22)
at TCP.onread (net.js:527:27)
ccboby:test ccboby$
不好意思,我之前是用的mo.toJSON(); 刚刚跑了一下 也是用的这个~
报错信息 /Users/ccboby/Desktop/nodeprojects/test/MsgObj.js:6 return JSON.stringify(this); ^ RangeError: Maximum call stack size exceeded
嗯 更改后成功了, 好厉害!! 但是为什么呢? 我试了一下 改成 MsgObj.prototype.toJN 再调用mo.toJSON() 他会提示 has no method ‘toJSON’ 应该代表不是内置方法吧, 那为什么不能用这个 名字呢?
是不是 JSON.stringify(this); 会调用实例 的 toJSON 方法(如果有的话)
所以造成了循环调用?
@ccboby 对的
当对象存在 toJSON 方法时,JSON.stringify 会优先调用这个方法。然后在这个方法里,又遇到了 JSON.stringify,于是无限循环,导致报错。
改成这样:
var MsgObj = function(name){
this.msg = {};
this.msg.name = name;
}
MsgObj.prototype.toJSON=function(){
return JSON.stringify(this.msg);
}
module.exports = MsgObj ;