Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否验证url.format(url对象)?_Javascript_Node.js_Validation_Types_Schema - Fatal编程技术网

Javascript 是否验证url.format(url对象)?

Javascript 是否验证url.format(url对象)?,javascript,node.js,validation,types,schema,Javascript,Node.js,Validation,Types,Schema,我对这件事很好奇。特别是url.format(urlObject)方法。我想创建一个函数,在调用format之前验证urlObject,如果任何对象键/值对无效或“extra”(规范中不存在),则抛出TypeError 除了打字脚本之外,还有什么方法可以实现这一点吗?您将很难做到这一点,因为当您创建URL实例时: u=新URL('http://example.com/'); Object.keys(u)和Object.getOwnPropertyNames(u)都将返回一个空数组,甚至JSON

我对这件事很好奇。特别是
url.format(urlObject)
方法。我想创建一个函数,在调用format之前验证
urlObject
,如果任何对象键/值对无效或“extra”(规范中不存在),则抛出TypeError


除了打字脚本之外,还有什么方法可以实现这一点吗?

您将很难做到这一点,因为当您创建
URL
实例时:

u=新URL('http://example.com/');
Object.keys(u)
Object.getOwnPropertyNames(u)
都将返回一个空数组,甚至
JSON.stringify(u)
在这里对您没有帮助,因为它会生成一个顶级字符串,而不是对象的JSON表示

因此,除非手动解析
util.format(u)
或类似的输出,否则您将无法轻松检查任何额外字段,但您仍然需要检查对象键(包括不可枚举的属性),以验证不是
URL
实例的其他对象

因此,最合理的解决方案是检查URL的
u instanceof
是否为真,如果为真,则相信它是好的,但如果为假,则检查特定属性

但是请记住,
url.format()
不需要实际的
url
实例,例如,这两行具有相同的效果:

a=url.format(新url('http://example.com/'));
b=url.format({协议:'http',主机:'example.com',路径名:'/'});
//a==b
要验证
URL
实例(或任何其他对象)是否具有以下属性,并且这些属性是字符串,就像它应该在
URL
实例中一样,可以使用以下内容:

const k=[
“href”,
“起源”,
“协议”,
“用户名”,
“密码”,
“主机”,
“主机名”,
“港口”,
“路径名”,
“搜索”,
“散列”,
];
const validull=u=>k.filter(k=>typeof u[k]=='string')。长度===k.length;
对于正常的
URL
实例,这将返回
true

u=新URL('http://example.com/');
控制台日志(validull(u));
但对于其他对象,如果它们具有所有必需的字段,也是如此。 但是请记住,
url.format()
并不需要所有字段,正如您在上面的示例中所看到的那样,这样您就可以拒绝一些对于
url.format()
非常合适的值,例如:

u={协议:'http',主机:'example.com',路径名:'/'};
总而言之:

Real
URL
实例不会向您显示它们有哪些属性,因此您不会轻易测试额外的属性-但我不建议您这样做,因为如果
URL
使用将来可能发生的新属性进行扩展,您的代码将中断

要查看它是否具有所有必需的(在您看来-不一定是
url.format()
!)属性,您可以编写一个简单的验证器函数,但是如果没有,您将无法省略空属性,如
username
,并且必须显式地为所有空属性传递空字符串,如果您希望能够使用类似于
URL
的对象,这些对象在其他方面与
URL.format()
兼容

也许您只想测试一些字段,如协议、主机和路径名,但是您必须处理
url。format()
将采用
host
hostname
,如果两者都可用,则首选
host

你也可以尝试一些类似这样的技巧:

const testUrl=u=>{
试一试{
新的URL(URL.format(u));
}捕获(e){
抛出新的TypeError(“您的错误消息”);
}
};
并且有一个函数,可以实验性地测试给定值是否与
url.format()
一起工作,给出一个可通过
new url()解析的url()
,如下所示:

testUrl(新的URL('http://example.com')); // 好啊
testUrl({host:'example.com',protocol:'http'});//好啊
testUrl({host:'example.com'});//抛出一个打字错误
现在,在调用
url.format(urlObject)
的函数中,只需在前面的行中添加:
testUrl(urlObject)
,它将抛出您描述的异常

总而言之,这是一个棘手的问题。你可以用很多方法来做,但都有一些缺点。
URL
实例实际上非常奇怪,甚至Joi在它们上面也会中断

例如:

!对象({host:joi.string().required()})。验证({host:'example.com'})。错误;
//返回true
!对象({host:joi.string().required()})。验证({nohost:'example.com'})。错误
//返回false
!对象({host:joi.string().required()})。验证(新URL('http://example.com/)。错误;
//这引发了一个异常!
//TypeError:无法读取未定义的属性“主机”
//WTF???
如果连Joi都不能验证
URL
实例,那么它们就不容易验证


希望上面的一些示例能够满足您的需要。

即使是typescript也不会“验证”这些对象。它只会阻止对未包含在给定对象中的对象调用属性type@messerbill它不会编译。你理解我的问题。它将编译,因为url将在运行时设置…否则我理解错你的问题。我认为您试图“检查”
urlObject
的值并对其进行验证-期望在运行时发送一些无效数据