问一个初级的js问题
发布于 10 年前 作者 ccboby 13202 次浏览 最后一次编辑是 8 年前

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$ 
11 回复

为什么只有人看没人回啊~!自己顶一个

{“a”:“123”}你传入这个试试

同是新手,看能不能帮忙! resopnes.end(mo.toJSON); mo.toJSON 是一个函数哦, 是不是应该先mo.toJSON();一下?

不好意思,我之前是用的mo.toJSON(); 刚刚跑了一下 也是用的这个~

报错信息 /Users/ccboby/Desktop/nodeprojects/test/MsgObj.js:6 return JSON.stringify(this); ^ RangeError: Maximum call stack size exceeded

试了,报错 好像提示是 数据类型的错误,我在问题里面更新了~ 肿么办?

将MsgObj.prototype.toJSON修改为其他的即可,比如说MsgObj.prototype.toJSO之类的,错误很明显的。。。

嗯 更改后成功了, 好厉害!! 但是为什么呢? 我试了一下 改成 MsgObj.prototype.toJN 再调用mo.toJSON() 他会提示 has no method ‘toJSON’ 应该代表不是内置方法吧, 那为什么不能用这个 名字呢?

是不是 JSON.stringify(this); 会调用实例 的 toJSON 方法(如果有的话)

所以造成了循环调用?

@ccboby Maximum call stack size exceeded 这句话说的不是很明显吗。。。

Maximum call stack size exceeded 循环调用_(:з」∠)_

@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 ;
回到顶部