将Google Analytics事件跟踪附加到页面上的超链接存在严重问题(如文档中所示).
例:
<a
href="http://www.example.com/"
onclick="_gaq.push(['_trackEvent', 'Links', 'Click', 'Example Link']);"
>
Example!
</a>
Run Code Online (Sandbox Code Playgroud)
当用户点击Google Chrome浏览器中的此类链接时,GA开始将请求发送到服务器(事件跟踪),但浏览器也开始加载另一个页面(在链接之后)并且GA请求被"取消" ",因此事件未到达GA服务器,并且未显示在统计信息中.
我们该如何应对呢?
例如,当事件到达GA服务器时,我们可以将导航延迟到链接页面,但是如果GA请求是异步的,我们怎么能这样做呢?我们在文档中找不到任何回调功能.
有没有办法在推送命令执行时得到通知?
我想在Ansible中分享不同角色之间的默认值.是否有可能直接实现这一目标?是否有解决方法,可能是解决此问题的另一种方法?我只想保持默认值DRY.
这是我的一部分package.json:
{
...
"devDependencies": {
"gulp": "~3.8",
...
},
...
}
Run Code Online (Sandbox Code Playgroud)
我正在运行以下命令:
gulp --version
CLI version 3.8.7
Local version 3.8.6
npm update
gulp --version
CLI version 3.8.7
Local version 3.8.6
rm -Rf ./node_modules/
npm install
gulp --version
CLI version 3.8.7
Local version 3.8.7
Run Code Online (Sandbox Code Playgroud)
该npm update命令无效.
只有在我手动删除node_modules目录并运行npm install开发包之后才会更新.这是什么原因?是否有可能在没有这样麻烦的情况下实际更新开发包?
考虑具有两个实体的应用程序:
User (包含基本用户数据,例如名称)Passport (包含身份验证凭据,即密码)还有两个内部微服务:
UserService (负责创建和管理用户及其基本数据)AuthService (负责用户身份验证和密码处理)该User实体属于UserService和Passport实体属于AuthService.
这两个服务应该分开,因为它们解决了截然不同的任务:配置文件数据和身份验证.
另外,请考虑我们有一个包含三个字段的注册表:
此表单将触发GatewayService对该应用程序的HTTP请求,该请求拦截对应用程序的所有请求并将它们路由到内部微服务(或组合/聚合它们).
现在,当网关服务收到包含所有表单数据的请求时,它需要执行以下操作:
UserService创建新用户(它将以生成的方式响应userId).AuthService为新创建的用户创建护照.它将需要userId步骤#1中收到的和password原始请求中的字段.这看起来非常简单,但如果AuthService在步骤#2中不可用会发生什么?我们需要以某种方式分离这些请求!
经典方法是使用最终一致性并Passport通过异步调用创建实体(我们可以将此请求放入队列并在单独的服务中处理它).为了做到这一点,我们将向AuthService传递userId和password向它发送异步请求,而不是步骤#2,因此步骤#1将立即返回对客户端的响应.
但是,如果password字段格式不正确(打破验证规则)怎么办?验证逻辑仅出现在AuthService,因此我们无法知道密码是否正确,直到调用它为止.现在,请求是异步处理的,因此我们无法回复用户并告诉他更正密码.
那么,您如何正确处理微服务应用程序的分布式复合请求中的验证?
天真的解决方案是将验证逻辑移到GatewayService自身,但这是一个糟糕的主意,因为它会使它变胖并且会泄露业务逻辑AuthService.
另一个想法是提供一种额外的密码验证方法,并在步骤#1和#2之前调用它.它看起来像一个可行的解决方案,但它将迫使我们为我们的微服务中的每个业务方法提供两种方法,一种用于事先验证,一种用于实际操作.此外,验证和操作之间存在时间空间,因此在实际执行操作时,较早的正确值可能会变得不正确.
我们可以将表单拆分为两个以避免复合请求,并在询问个人数据并为他创建帐户后询问用户密码.但是,这可能会导致安全问题,其中一些其他可能猜到下一个用户的用户可以拦截用户帐户userId.我们可以使用一些额外的安全令牌,但它会为服务引入奇怪的功能,并使整个设置更加复杂.
此外,这种方法看起来像是试图逃避问题,您不能总是避免复合请求.
我们可以使用全面的分布式事务,例如2PC,但它会使系统变得非常复杂,并且首先会减少MSA的使用.
最后的想法是将这两种服务合并在一起,但在微服务架构中这样做是没有意义的.
architecture software-design distributed-transactions microservices
我正在开发一个与Angular中的表单一起使用的自定义组件.我正在实现ControlValueAccessor界面,它工作得很好.
但是,我的组件没有理由在没有required验证器的情况下使用(它是CAPTCHA),因此组件的所有调用都必须指定required验证器.
是否有可能以某种方式将此验证器直接嵌入到我的组件中,因此当与ngModel和表单(基于模板的和被动的)一起使用时,它将始终应用于它?
澄清.考虑这个例子:
<my-captcha [(ngModel)]="firstCaptcha" required></my-captcha>
<my-captcha [(ngModel)]="secondCaptcha" required></my-captcha>
<my-captcha [(ngModel)]="thirdCaptcha" required></my-captcha>
Run Code Online (Sandbox Code Playgroud)
MyCaptcha上面组件的所有调用都必须使用该required属性,以便将所需的验证器应用于表单控件.
是否可以在不明确指定required属性的情况下调用我的自定义控制器,但是仍然应用了验证器?像这样:
<my-captcha [(ngModel)]="captchaValue"></my-captcha>
Run Code Online (Sandbox Code Playgroud) 我正在使用S3存储桶来存储文件,使用CloudFront来分发它们.我有一个自动处理同步的工具,它工作得很好.
但是,我希望能够以编程方式创建CloudFront失效.我需要在工具的策略中添加什么语句才能为此特定分发创建无效?
现在,我有这样的声明:
{
"Effect": "Allow",
"Action": [
"cloudfront:CreateInvalidation"
],
"Resource": "*"
}
Run Code Online (Sandbox Code Playgroud)
但是,正如您所看到的,它允许为帐户中的任何分配创建失效.
我试图将这些值用于Resource属性,但由于某种原因,该工具给了我一个错误,说访问被拒绝:
arn:aws:cloudfront::12345678:distribution/ABCDEFGarn:aws:cloudfront:::distribution/ABCDEFG我需要在Resource属性中指定什么才能允许仅为特定分布创建失效?
arn:aws:cloudfront::12345678:distribution/ABCDEFG例如,这是ARN .
当用户到达我的应用程序中受特殊保护的路由时,我将他重定向到登录路由,以执行身份验证。
但是,在成功验证后,我不想将她重定向回她最初到达的路线。
如何在 Angular 中保留中间路由状态然后重定向到它?
通过路由状态,我的意思是:
考虑到我有一个调用服务器并通过Observable返回用户数据的函数:
getUserById (id: number): Observable<User> {
return this.http.get('/users/' + id)
.map(response => response.json())
;
}
Run Code Online (Sandbox Code Playgroud)
我如何使其表现得更像诺言?
问题是,只有有人订阅了返回的可观察对象,才会发出请求。另外,完成多个订阅后,服务器将被多次调用。
我想要的是:
在被调用时立即调用服务器getUserById()(订阅应该是可选的,只有在调用者确实想要获取返回值或在请求完成时才知道的情况下)
多个订阅不应产生多个请求,而应返回从服务器获得的相同值
使用这种方法,我将能够使此功能起作用:
refreshUser (): Observable<User> {
return repository.getUserById(this.currentUser.id)
.map(user => this.currentUser = user)
;
}
Run Code Online (Sandbox Code Playgroud)
调用时refreshUser(),应该发出请求并this.currentUser = user进行评估。如果需要,我可以订阅返回的observable以获得新数据,例如:
// Just refreshes the current user
refreshUser();
// Refreshes the current user and obtains fresh data
refreshUser().subscribe(user => console.log('Refreshed user', user));
Run Code Online (Sandbox Code Playgroud)
我尝试使用publish(),refCount()并且share()以不同的组合使用,但是它仅对第一个要求有所帮助(即避免多次调用服务器),但是如何使原始的可观察性变热呢?
经过使用不同选项的进一步研究之后,似乎使用getUserById()热解决方案无法解决该问题,因为我在不同级别上有两个映射函数(一对一getUserById()和一对in refreshUser()),并且我需要它们都执行。为了解决这个问题,我需要以某种方式从下到上“推动”可观察对象。看起来每个级别都需要大量样板代码。
在诺言中,它看起来非常简单: …
有没有办法实际创建一个类,它将扩展EventTarget DOM API 类?
考虑一下,我正在上这门课:
class MyClass extends EventTarget {
constructor() {
super();
}
private triggerEvent() {
this.dispatchEvent(new Event('someEvent'));
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试实例化它时,我收到此错误:
ERROR TypeError: Failed to construct 'EventTarget': Please use the 'new' operator, this DOM object constructor cannot be called as a function.看起来这是因为这个 API 需要适当的 ES2015 类才能工作,但我正在将我的代码转换为 ES5 级别。
如果我使用这样的构造函数:
constructor() {
Reflect.construct(EventTarget, [], MyClass);
}
Run Code Online (Sandbox Code Playgroud)
尝试addEventListener()在实例上调用时出现以下错误:
ERROR TypeError: Illegal invocation.作为副作用,我也收到了这个 TypeScript 编译错误:
error TS2377: Constructors for derived classes must contain a 'super' call. …众所周知,WebKit 的 ITP和第三方 cookie阻止正在阻止常见的 SSO 技术正常工作。当用户自动登录到新访问的域时,这尤其与 SSO 的所谓静默登录功能相关,该域连接到她已经通过身份验证的某个身份验证服务器(具有活动的“全局”会话)。我相信这通常是使用隐藏的 iframe 和后消息来实现的。
看起来主要的 IAM 提供商已经屈服于这些障碍,只提供有限的功能。例如,Stack Exchange 门户不仅不支持静默登录,而且当您显式单击登录按钮时甚至无法恢复其他门户上的活动会话:
AskUbuntu 无法自动恢复 StackOverflow 上的活动会话。
所以,我的问题是:
1)。实际上是否有可能在实现 SSO(尤其是静默登录功能)时克服这些限制,而无需将整个浏览器窗口重定向到身份验证服务器?是否可以使用 XHR + CORS 来实现此目的?或者也许其他一些存储机制(例如 LocalStorage、Cache API、Service Workers 等)可以在禁用 cookie 的情况下保留会话?
2)。Google 如何通过 google.com/youtube.com 域解决此问题?看起来他们确实在恢复全局会话时重新加载整个应用程序,但只有当用户实际使用 Google 登录时才会发生这种情况。如果用户未登录,YouTube 不会自行重新加载。他们如何检测用户是否确实获得了全局会话?
angular ×4
amazon-iam ×1
ansible ×1
architecture ×1
components ×1
cookies ×1
cross-domain ×1
dom ×1
es6-class ×1
javascript ×1
node.js ×1
npm ×1
reactivex ×1
rxjs ×1
typescript ×1
validation ×1