问一个初级的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 ;

//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$


10 回复

根据你的描述,你遇到了两个主要问题:

  1. RangeError: Maximum call stack size exceeded 错误。
  2. 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');
});

总结

  1. 修复 toJSON 方法:避免递归调用,只返回需要的数据。
  2. 确保传递给 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()); 这样的方式传递数据时,遇到了错误信息。

问题分析

  1. RangeError: Maximum call stack size exceeded

    • 这个错误通常是因为递归调用导致的。在这个例子中,可能是由于 JSON.stringify(this) 在处理对象时发生了无限循环。
    • 你的 MsgObj 对象中有 this 指向自身的情况,这会导致递归调用,从而超过最大堆栈大小。
  2. 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');
});

解释

  1. toJSON 方法:确保 toJSON 方法返回一个简单的对象,避免可能导致递归调用的情况。
  2. res.end() 方法:调用 mo.toJSON() 方法并将其结果传递给 res.end(),确保传递的是一个字符串。

通过这些更改,你应该能够避免上述错误,并正确地传递 JSON 数据。

回到顶部