解决办法
先说最后的解决办法:之所以会有问题,因为用的是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' }
更多操作可查看文档:
解决过程
我在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 上,一个层主是这么回答的:
链接:
结合自己的理解简单翻译下来就是(我英语不好勉强翻译,有错请见谅):
因为我们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文档地址(中文):
果然打开以后发现了这行字:
晕,原来已经被废弃了。怪不得会出问题。心想我看的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了!问题解决了!