问一个初级的Nodejs js问题
问一个初级的Nodejs js问题
HI 各位大大早 我目前在学node 遇到这个情况 //MsgObj.js
var MsgObj = function(name){
this.name = name;
}
MsgObj.prototype.toJSON=function(){
return JSON.stringify(this);
}
module.exports = MsgObj ;
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$
根据你的描述,你遇到了两个主要问题:
RangeError: Maximum call stack size exceeded
错误。TypeError: first argument must be a string or Buffer
错误。
让我们逐一分析并解决这些问题。
问题1: RangeError: Maximum call stack size exceeded
这个问题通常发生在递归调用没有终止条件时,或者在对象中循环引用导致无限递归。在这个例子中,问题在于你在 toJSON
方法中使用了 JSON.stringify(this)
,而 this
对象包含一个指向自身的引用(即 MsgObj
实例),这会导致递归调用,最终超出调用栈大小限制。
示例代码:
var MsgObj = function(name) {
this.name = name;
}
// 修复前的代码
MsgObj.prototype.toJSON = function() {
return JSON.stringify(this);
}
// 修改后的代码
MsgObj.prototype.toJSON = function() {
return { name: this.name };
}
module.exports = MsgObj;
问题2: TypeError: first argument must be a string or Buffer
这个错误是因为你试图将一个非字符串或非缓冲区的对象传递给 res.end()
方法。你需要确保传递给 res.end()
的参数是一个字符串或缓冲区。
示例代码:
var MsgObj = require('./MsgObj');
var mo = new MsgObj("123");
// 假设这是你的HTTP响应处理逻辑
var http = require('http');
http.createServer((req, res) => {
res.writeHead(200, { 'Content-Type': 'application/json' });
res.end(JSON.stringify(mo.toJSON())); // 确保传递的是一个字符串
}).listen(9000, () => {
console.log('Server listening on port 9000');
});
总结
- 修复
toJSON
方法:避免递归调用,只返回需要的数据。 - 确保传递给
res.end()
的参数:必须是一个字符串或缓冲区。
通过这些修改,你应该能够解决上述问题,并且代码应该能够正常运行。
{“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 方法(如果有的话)
所以造成了循环调用?
Maximum call stack size exceeded 循环调用_(:з」∠)_
根据你的描述,你在使用 Node.js 的时候遇到了一些错误。具体来说,当你尝试通过 resopnes.end(mo.toJSON());
这样的方式传递数据时,遇到了错误信息。
问题分析
-
RangeError: Maximum call stack size exceeded
- 这个错误通常是因为递归调用导致的。在这个例子中,可能是由于
JSON.stringify(this)
在处理对象时发生了无限循环。 - 你的
MsgObj
对象中有this
指向自身的情况,这会导致递归调用,从而超过最大堆栈大小。
- 这个错误通常是因为递归调用导致的。在这个例子中,可能是由于
-
TypeError: first argument must be a string or Buffer
- 这个错误表示
resopnes.end()
方法需要一个字符串或缓冲区作为参数,但你传入的是一个函数。 mo.toJSON()
返回的是一个字符串,而不是一个函数,所以你需要直接调用mo.toJSON()
并将结果传给resopnes.end()
。
- 这个错误表示
示例代码修正
// MsgObj.js
var MsgObj = function(name) {
this.name = name;
};
MsgObj.prototype.toJSON = function() {
// 确保不要返回可能导致递归的结构
return {name: this.name};
};
module.exports = MsgObj;
// main.js
const http = require('http');
const MsgObj = require('./MsgObj');
const server = http.createServer((req, res) => {
var mo = new MsgObj("123");
// 调用 toJSON 方法并将结果传递给 res.end()
res.end(JSON.stringify(mo.toJSON()));
});
server.listen(9000, () => {
console.log('Server listening on port 9000');
});
解释
toJSON
方法:确保toJSON
方法返回一个简单的对象,避免可能导致递归调用的情况。res.end()
方法:调用mo.toJSON()
方法并将其结果传递给res.end()
,确保传递的是一个字符串。
通过这些更改,你应该能够避免上述错误,并正确地传递 JSON 数据。