解决在Node中出现 [Object: null prototype] 的问题

解决办法

先说最后的解决办法:之所以会有问题,因为用的是url的旧接口,该接口已经废弃了。应该用新的接口

const url = require('url');
let obj = new URL('http://test.com/index?name=YulRW&message=ok');
console.log(obj);

如果路径不完整的话可以这样用

const url = require('url');
let obj = new URL('/test?name=YulRW&message=666','http://localhost:8088/');
console.log(obj);

获取键值对操作:

const myURL = new URL('https://example.org/?abc=123');
console.log(myURL.searchParams.get('abc'));
// 打印 123

myURL.searchParams.append('abc', 'xyz');
console.log(myURL.href);
// 打印 https://example.org/?abc=123&abc=xyz

myURL.searchParams.delete('abc');
myURL.searchParams.set('a', 'b');
console.log(myURL.href);
// 打印 https://example.org/?a=b

那么,如果还是想用废弃的接口还怎么办?

var url = require('url')

let urlObj = url.parse('https://example.org/?abc=123',true);
let query = urlObj.query;   //输出--query: [Object: null prototype] { abc: '123' }
let str = JSON.stringify(query);
str = JSON.parse(str);
console.log(str.abc);       //输出--str: { abc: '123' }

更多操作可查看文档:

http://nodejs.cn/api/url.html#url_class_urlsearchparams

解决过程

我在B站学习Node的过程中,跟着老师的方法用

const url = require('url');

let obj = url.parse(req.url,true);

console.log(obj.query);

想要通过url模块的parse方法获取传过来的路径里面的键值对对象
像这样:
在这里插入图片描述
可是我发现我自己的代码执行后是这样的:
在这里插入图片描述
因为里面多了个 [Object: null prototype] 所以导致我不能直接从query对象里面点出来一个属性。
平常都是自己在百度里搜索看别人的经验然后来解决问题的,但是这次网上仅有一条提问,而且还没有解决问题。无奈只好自己去找解决办法。
首先想到了去外国网站上找,谷歌了一下发现确实有不少人也问 [Object: null prototype] 的问题。

stackoverflow 上,一个层主是这么回答的:
在这里插入图片描述
链接:

https://stackoverflow.com/questions/53636028/how-do-i-get-rid-of-object-null-prototype-in-visual-studio-terminal

结合自己的理解简单翻译下来就是(我英语不好勉强翻译,有错请见谅):
因为我们console了一个空对象,该对象没有原型,所以会显示出 [Object: null prototype](没有原型的意思是没有继承属性和方法,例如toString、hasOwnProperty等每个实例化每个对象时都会具有的方法)

当我们在node中这样时:

const obj1 = Object.create(null);
obj1['key'] = 'SomeValue' ;
console.log(obj1); 
>> [Object: null prototype] { 'key' : 'SomeValue' }

就会出现 [Object: null prototype]

而这样:

const obj2 = {};
obj2['key'] = 'SomeValue' ;
console.log(obj2); 
>> { 'key' : 'SomeValue' } 

就不会出现 [Object: null prototype]

此外,说是因为在 url.parse(req.url, false / true ) 时,会根据 true 或者 false 来选择不同的library来解码,
比如当选择true时用 qs
而当选择了false时用 query-string

至于他们有什么不同…之后我就不再讲了…感觉涉及的知识比较深入了。有兴趣的可以看下下面的连接:

https://stackoverflow.com/questions/29136374/what-the-difference-between-qs-and-querystring

由于没有解决问题,我继续查,突然想到可以翻阅Node文档,或许可以找到我想要的。

这里附上Node文档地址(中文):

http://nodejs.cn/api/url.html

果然打开以后发现了这行字:
在这里插入图片描述
晕,原来已经被废弃了。怪不得会出问题。心想我看的b站视频也不过是17年的,就过了两年就变化那么大…更新还是蛮快的。

所以说,官方文档还是蛮重要啊。网上没有的问题,或许查查文档就有解决办法了呢?

它说要用 WHATWG URL API ,那么什么是 WHATWG URL API 呢?
继续往上翻找到这个:
在这里插入图片描述
哦豁!不错,是我要的!
然后再根据文档教程写:

const url = require('url');

let obj = new URL('/test?name=YulRW&message=666','http://localhost:8088/');

console.log(obj);

结果:
在这里插入图片描述

舒服了!剩下的就不用我说了吧?照着用就好了。

不过需要注意的一点是,如果路径是以/开头的那种不完整路径,需要再第二个参数里面把前面的补上(参考我发的图),如果是一个完整的路径那么只要第一个参数就好了,例如:

let obj = new URL('http://baidu.com/index?name=YulRW&message=666');

OK了!问题解决了!

发布了8 篇原创文章 · 获赞 10 · 访问量 924

猜你喜欢

转载自blog.csdn.net/weixin_44710964/article/details/103552999
今日推荐