Javascript 将URL参数解析为dart不会在类型意外时覆盖类型

Javascript 将URL参数解析为dart不会在类型意外时覆盖类型,javascript,dart,dart-polymer,angular-dart,dart2js,Javascript,Dart,Dart Polymer,Angular Dart,Dart2js,我正在创建一个web应用程序,它为客户端查找解析路由参数的URL 示例:www.Example.com#userId=5 忽略上面的安全循环漏洞 我注意到,当导航到该页面时,它会在PolymerDart中调用:onRouteParams(映射参数)。这将有一个参数列表。然后我会说: int id = params.containsKey("userId") ? params["userId"] : -1; int id = params["id"]; 它会把它分配到那里。然后我尝试打印出变量

我正在创建一个web应用程序,它为客户端查找解析路由参数的URL

示例:
www.Example.com#userId=5

忽略上面的安全循环漏洞

我注意到,当导航到该页面时,它会在PolymerDart中调用:
onRouteParams(映射参数)
。这将有一个参数列表。然后我会说:

int id = params.containsKey("userId") ? params["userId"] : -1;
int id = params["id"];
它会把它分配到那里。然后我尝试打印出变量

#userId=5
userId: 5, Type: int
id: 5, idType: int
我把传入的参数改为hodor

我注意到的这个问题产生了一个问题,因为您将要执行与int相关的代码,但是是在字符串上完成的。因此,转换后的javascript将不会是可靠的

在Dartium中,问题被捕获:

VM367:1 EXCEPTION: NoSuchMethodError: Class 'String' has no instance method '<='.
Receiver: "hodor"
Tried calling: <=(0)
逻辑的基本原理是,函数的参数是经过验证的。这里的情况并非如此,因为它是有效的,它是一张地图。我很好奇的一个问题是,当你做作业时,它应该验证它是假设的

比如:

int id = params.containsKey("userId") ? params["userId"] : -1;
int id = params["id"];
应该解析为javascript:(如polyfill:)

或类似的

这是我遇到的一个错误,返回时会发生在整个应用程序代码中,可能是其他人应用程序中的一个问题

如果你不得不问“为什么有人会不小心将foo放入url参数”,逻辑推理是如果他们想保存url并将其粘贴到其他地方,他们可能会不小心多次点击v one,最后一个参数是:
www.example.com#userId=5v
,它会立即将userId转换为字符串,并导致此类问题的发生

我正在研究strong模式,以及它如何为dart2js构建应用程序,如何定义路由参数,等等。这个问题似乎没有真正得到解决


所有的标签都是相关的,因为可能我遗漏了其他人已经发现的某个方面。这显然像是一个省道键入问题,由于路由问题而暴露出来。

不确定问题出在哪里。URL中的值总是字符串,而不是整数,除非转换它们。我也是这么想的。好像它把它们转换成了整数。因此,参数是一个int,被分配给int。URL是一个字符串,但在某个地方它似乎将其解析为int。然后,参数是一个正确的字符串,尽管被分配给int,它仍将其保留为字符串。我想可能会发生类型错误。我不知道为什么或者如何将参数设置为类型。我也认为应该都是字符串,但当我看到打印int的案例时,感觉好像有自动投射,Dart中不应该有自动投射(除了浏览器中的
int
double
之间)。也许是因为调用JS,但我不知道上面的代码做了什么。聚合物主要是关于给JS打电话。你肯定是对的。我在更深层次上观察它,沿着这条路线沿着链条往上走。起初,我犯了一个错误,认为onRouteParams是一个我可以利用的聚合关联函数,这是错误的。它是由一个横向框架团队创建的。沿着这条链一直到更高的组件,我认为这只是一个传递的映射。您当然是对的,因此路由参数的这个概念也需要按类型进行解析。也不是说这个问题是错误的,变量应该更多地验证它们的类型,而不是在幕后强制转换到其他类型。在开发过程中使用checked模式,生产中的类型不是checkrd。这将在Dart 2.0 AFAIK中更改。
if (Number.isInteger(params["id"]){
    var id = params["id"];
}else{
    throw new TypeError("not castable string attempting to cast to int");
}