我正在重新构建我的构建系统,我已经读过带有grunt的node.js是一个很好的方法.我也没用过,而且我遇到了一些麻烦.
问题是我想建立一个可移植的构建环境,我可以将其包含在我的项目的版本控制中(也许这是不可能的).获取node.js和npm工作一直没有问题.但是,我看到安装grunt的每条指令都说使用-g
带有npm 的标志,它会全局安装它.由于我想要一个完全可移植的环境,我试图将其关闭,但我无法工作.
我错过了什么,或者我试图做的不可行?
我正试图在我的一个应用程序中开始实现Web Push.在我发现的示例中,客户端的端点URL通常存储在内存中,其注释如下:
在生产中,您将其存储在您的数据库中......
由于只有我的应用程序的注册用户可以/将获得推送通知,我的计划是将端点URL存储在我的数据库中用户的元数据中.到现在为止还挺好.
当我想允许同一用户在多个设备上接收通知时,问题就出现了.理论上,我将为用户订阅的每个设备添加一个新的端点到数据库.但是,在测试中我注意到端点随同一设备上的每个订阅/取消订阅而变化.因此,如果用户在同一设备上连续多次订阅/取消订阅,我最终会为该用户保存几个端点(除了其中一个端点都不好).
从我读过的内容来看,当用户取消订阅或端点无效时,没有可靠的通知方式.那么,如何在添加新端点之前判断是否应删除旧端点?
什么是通过重复订阅/取消订阅填充我的数据库端点来阻止用户有效地发起拒绝服务攻击?
这更像是一个笑话(我可以忽略限制给定用户的总端点),但我看到的问题是,当发送通知时,我将使用数百个无效端点通知来爆炸通知服务.
我希望我的服务器上的订阅逻辑是:
问题是我无法弄清楚如何可靠地做#1.
我厌倦了编写这样的代码:
class Something {
constructor() {
this.method = this.method.bind(this);
this.anotherOne = this.anotherOne.bind(this);
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
很费时间,而且很容易忘记绑定一个方法。我知道 class fields 提案,但它仍然是第 3 阶段,似乎有一些问题。
我当前的解决方案(基于此答案)如下所示:
class Something {
constructor() {
// Get all defined class methods
const methods = Object.getOwnPropertyNames(Object.getPrototypeOf(this));
// Bind all methods
methods
.filter(method => (method !== 'constructor'))
.forEach((method) => { this[method] = this[method].bind(this); });
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但我想知道是否有更好的方法,或者此方法是否存在我不知道的问题。
我遇到的问题是,如果我没有在构造函数中绑定我的类函数,我必须记住以后“正确地”调用它们。例如:
const classInstance = new Something();
// This fails for a non-obvious reason
someAction()
.then(classInstance.method);
// This …
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Google和OpenID Connect实现联合登录系统,并且我无法验证和解析我从Google收到的JWT ID令牌.我在这里关注Google的文档.
根据文档的建议,我正在尝试使用现有的JWT库.GitHub上最流行的PHP版本似乎是PHP_JWT.问题似乎是JWK键的格式.
上面链接的谷歌文档说,从jwks_uri
他们的发现文档中显示的端点获取密钥.该端点返回以下内容:
{
"keys": [
{
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"kid": "1771931eb0eb64eb97733e857685be153e079bb9",
"n": "AMNFQMNJw/EVwrYsyPTnEHWkaPinPb4ngc/SqD701aisFhbU9/wWoKADeFtwfBcWl1qjzIqhPorQElB+2mtiqUh3Qtaazt1x5wA9XnJDe6kjtMGm9nNLMilSVNBilAE8GIdbciMycISfOfL0WRaJrqpNxewNEVZjuYiGzOWahiDP",
"e": "AQAB"
},
{
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"kid": "7b3bc600209875d3c42ae277a0d018d1d21986ec",
"n": "AN2UvG5+hNEMIPIbnpPm+JQi6LFWXBPzg3Ltb3xkVmSTjVaCFWppw/ZYRBgpToGKZP9XJstlOE88SDUFSMZIkIqtLpnUqmZax2Zc2gjEB9PhmHSH3/tTmtZ1U0X6V+crqitZ2uc3NV78vCn9/s+WuPwk/gfKBG8Cirb0fgLmsPd9",
"e": "AQAB"
}
]
}
Run Code Online (Sandbox Code Playgroud)
查看JWT类和方法的源代码,看起来参数可以是一个数组,但是它们希望数组键是和数组值:.它很简单,可以拉出属性并将它们用作数组键,但应该用什么作为数组值?decode
verify
$keys
kid
@param string|resource $key for HS*, a string key works. for RS*, must be a resource of an openssl public key
kid
从谷歌的JWKs文档来看,它看起来像我们正在使用RS*
,但我不知道关键对象的哪一部分resource of an openssl public …
我正在为网站制作新的布局,我非常接近实现我想要的结果.但是,有一个问题.我正在使用这里描述的技术的改编(http://nicolasgallagher.com/multiple-backgrounds-and-borders-with-css2/demo/backgrounds.html,参见大猩猩下面的3栏示例).基本上,我的版本使用绝对定位的CSS伪元素作为左列的背景.
当我尝试将一个box-shadow
应用于伪元素时,我的问题出现了.元素及其阴影始终显示在我的主列顶部.
为了使所有这一切更清楚,我在这里创建了一个简单的示例页面:http://www.3strandsmarketing.com/test4.html
我担心的是,因为我正在使用基于我的主列的父元素的伪元素,所以它永远不能坐在它下面,但我希望有一些方法可以解决这个问题.有任何想法吗?
我听到很多关于电子邮件的" 开放时间个性化 ",我很难找到技术实际工作原理的解释.我能想到的可以在开放时间更改的电子邮件的唯一部分是图像内容.它可能是这样的:
但是,我看到的引用似乎指向更精细的定制(例如更改哪个产品).怎么可能在开放时间更改电子邮件的文本?我在这里遗漏了什么,还是仅仅是花哨的图像交换?如何使用Gmail的图片缓存?
这是这个答案的后续。
我有一些 3rd 方代码(react 组件),我将它们捆绑为 ES 模块(使用pkg.module
入口点)。这很好用(你得到模块连接和树摇动),但包含的代码没有用 babel 转译,因为按照大多数配置示例,我node_modules
在 webpack 配置的 babel-loader 部分排除了这样的:
{
...
module: {
rules: [
{
exclude: /(node_modules)/,
use: {
loader: 'babel-loader',
...
}
}
]
},
...
}
Run Code Online (Sandbox Code Playgroud)
所以,当我运行 webpack 时,我收到了意外的令牌错误。根据链接的答案,我从使用 an 切换exclude
到 aninclude
以选择性地引入一些这样的包node_modules
:
{
...
module: {
rules: [
{
include: [/node_modules\/@my-scope/, /src/],
use: {
loader: 'babel-loader',
...
}
}
]
},
...
}
Run Code Online (Sandbox Code Playgroud)
这似乎对我有用(当我运行 webpack 时不再出现意外的令牌错误),但我不能 100% 确定它正在做我认为的事情。
这个解决方案看起来正确吗?有没有更好的办法?
javascript ×2
arrays ×1
babel-loader ×1
babeljs ×1
css ×1
ecmascript-6 ×1
email ×1
function ×1
google-oauth ×1
gruntjs ×1
html ×1
jwt ×1
node.js ×1
object ×1
php ×1
web-push ×1
webpack ×1