分享

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

 wenxuefeng360 2022-11-06 发布于四川

解决办法

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

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

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

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

解决过程

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

  1. const url = require('url');
  2. let obj = url.parse(req.url,true);
  3. console.log(obj.query);

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

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

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

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

当我们在node中这样时:

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

就会出现 [Object: null prototype]

而这样:

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

就不会出现 [Object: null prototype]

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

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

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

由于没有解决问题,我继续查,突然想到可以翻阅Node文档,或许可以找到我想要的。
果然打开以后发现了这行字:
在这里插入图片描述
晕,原来已经被废弃了。怪不得会出问题。心想我看的b站视频也不过是17年的,就过了两年就变化那么大…更新还是蛮快的。

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

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

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

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

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

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

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

OK了!问题解决了!

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多