在过去的几天里,我一直在阅读有关使用刷新和访问令牌进行身份验证的内容,但这是我找不到答案的一件事。假设发送了过期的访问令牌。后端是否应该自动刷新它(如果提供了刷新令牌),或者刷新应该只在刷新端点完成?
作为示例,请考虑以下两个身份验证流程:
前端不必担心刷新令牌,但它仍然必须在每次请求后查找响应标头以检查是否发送了新令牌。
refresh/。API 检查令牌是否有效。如果一切正常,它会返回一个新的访问令牌。每次请求后,客户端都必须检查令牌是否过期,如果过期,则必须执行新请求来刷新令牌。正在向服务器发出更多请求,但另一方面,职责可以更好地分离,因为身份验证路由仅负责处理访问令牌,而刷新令牌处理则位于另一个路由中。
我很难找到有关该主题的资源,因此我不太确定哪种解决方案更好,或者即使我描述的解决方案完全正确。如果我必须选择一个,我会选择自动刷新,因为发出的请求更少,而且客户端可用性看起来更好,但正如我所说,我并不是 100% 同意这一点,因此我正在制作该线程。
访问令牌应该如何刷新?
我正在构建一个 Flutter 应用程序。我有一个看起来像这样的课程:
class ToDo {
String _title;
bool _done;
String get title => _title;
void set title(String newTitle) { _title = newTitle; }
bool get _done => _done
void set done(bool done) { _done = done; }
}
Run Code Online (Sandbox Code Playgroud)
但是 Dart linter 抱怨我应该“为了安全起见,避免在 getter 和 setter 中包装字段”。然而,这对我来说没有多大意义。现在 getter 没有用,但是如果将来我需要在从外部访问变量之前进行某种处理怎么办?我所要做的就是更新吸气剂。但是,如果属性是公开的并且可以直接访问,那么如果某些业务规则发生变化,我将不得不更新整个代码库。
那么这个警告有什么意义呢?或者,换句话说,为什么创建“无用的吸气剂”是一种不好的做法?
我正在为 Express 项目编写测试,但是当我运行测试脚本时,我的环境变量未加载。
在其他线程中,人们建议使用--setupFiles dotenv/config,我也这样做了,但不幸的是它不起作用。我尝试将其添加到我的测试脚本和文件中jest.config.js,但没有成功。有人对如何解决这个问题有任何提示吗?
语境
这就是我设置 jest 的方式package.json:
"scripts": {
"test": "jest --watchAll --setupFiles dotenv/config"
},
"jest": {
"testEnvironment": "node"
},
Run Code Online (Sandbox Code Playgroud)
在文件顶部app.js,我加载环境变量
require('dotenv').config();
这是我的文件夹结构:
我正在使用 Angular 构建一个博客,并且想使用 Markdown 创建我的帖子。我打算用ngx-markdown它来渲染它们。现在我正在创建一个“创建后”组件。问题是我想在降价上应用一些样式,但我不能。这是我的组件:
<div class="header-container">
<h1 class="header">New post</h1>
<button>Send</button>
</div>
<div class="main-container">
<div class="post-editor">
<label for="title">Title:</label>
<input class="title-field" type="text" name="title"
placeholder="E.g: Introduction to Programming" autocomplete="off"
[(ngModel)]="post.title"
>
<textarea [(ngModel)]="post.content"></textarea>
</div>
<div class="post-preview">
<markdown class="markdown" [data]="getPostAsString()" ngPreserveWhitespaces>
</markdown>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
import { Component, OnInit } from '@angular/core';
interface Post {
title: string;
content: string;
}
@Component({
selector: 'app-create-post',
templateUrl: './create-post.component.html',
styleUrls: ['./create-post.component.css']
})
export class CreatePostComponent implements OnInit {
post: Post = {
title: 'Introduction to Programming', …Run Code Online (Sandbox Code Playgroud) 我想显示一个 AlertDialog 来提示用户选择颜色。我做到了,但是,ColorPicker 和操作按钮之间有很多空白:
如何删除空白并使对话框达到应有的大小?我尝试过使用 aDialog而不是 an AlertDialog,并将我的内容包装在 a 中Column并mainAxisSize设置为MainAxisSize.min,但都不起作用。一件奇怪的事情是,传递给的值contentPadding似乎对 UI 没有影响。我尝试了不同的值,但它保持不变。
这是代码:
void _showColorPickerDialog() {
showDialog(
context: context,
builder: (BuildContext context) {
return AlertDialog(
contentPadding: const EdgeInsets.all(6.0),
title: Text('Pick a color'),
content: MaterialColorPicker(),
actions: [
FlatButton(
child: Text('CANCEL', style: TextStyle(color: Colors.blue)),
onPressed: Navigator.of(context).pop),
FlatButton(
child: Text('OK', style: TextStyle(color: Colors.blue)),
onPressed: Navigator.of(context).pop),
],
);
});
}
Run Code Online (Sandbox Code Playgroud)
(Material ColorPicker) 包的作者提供了一些代码,展示了如何执行此操作,这与我的非常相似,但它也有同样的问题。可能我的Flutter版本和他的不一样。无论如何,你们知道有什么好的方法来解决这个问题吗?提前致谢。
我想用这个界面创建一个命令:
cy.getTableCell({ column: 'Name', row: 42 }).contains('Douglas Adams')
Run Code Online (Sandbox Code Playgroud)
where将返回与表的第 42 行对应的getTableCell表单元格 ( ) 上的列。我想出了这个实现:td'Name'
type GetTableCellParams = {
columnName: string;
rowIndex: number;
};
Cypress.Commands.add(
'getTableCell',
({ columnName, rowIndex }: GetTableCellParams) => {
cy.contains('th', columnName)
.invoke('index')
.then((index) => {
cy.get('tr')
.eq(rowIndex)
.within((row) => {
return cy.get('td').eq(index);
});
});
}
);
Run Code Online (Sandbox Code Playgroud)
它确实找到了正确的表格单元格。但是,由于它在回调中执行此操作,因此我无法对其执行任何操作 - 我希望能够调用可链接的方法,例如contains、click等。我如何重构它以便调用者可以访问此元素,能够调用contains、click和其他可链接的方法吗?
我还可以在函数可读性方面使用一些帮助。它看起来一团糟 - 我猜问题出在嵌套回调上......
我正在尝试将 Maven 支持添加到我现有的 JavaFX 项目中。
我首先遵循 OpenJFX 的入门指南,该指南教您如何使用 Maven 编译和运行 Hello World JavaFX 应用程序。完成后,我将项目的文件粘贴到这个新项目中并进行了所需的更改。我的文件夹结构或多或少是这样的:
src/main/
java/
org.openjfx/
Main.java
components/
controllers/
resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)
为了运行该项目,我使用以下 Maven 命令:
compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud)
但是,我收到此错误:
应用程序启动方法中的异常 原因:java.lang.IllegalAccessException:类 javafx.fxml.FXMLLoader$ValueElement (在模块 javafx.fxml 中)无法访问类 org.openjfx.controllers.LoginController (在模块 org.openjfx 中),因为模块 org. openjfx 不会将 org.openjfx.controllers 导出到模块 javafx.fxml
这看起来很奇怪,因为显然我正在导出以下内容module-info.java:
src/main/
java/
org.openjfx/
Main.java
components/
controllers/
resources/org.openjfx/fxml/
Run Code Online (Sandbox Code Playgroud)
我想知道命名我的包是否org.openjfx是一个坏主意并且可能会导致问题,但我只是按照教程进行操作。
以下是我的pom.xml文件(如果有任何相关性):
compiler:compile
javafx:compile
javafx:run
Run Code Online (Sandbox Code Playgroud) 我的用户有以下 Joi 模式:
\nconst userRules = Joi.object({\n name: Joi.string().pattern(new RegExp(\'^[A-Za-z\xc3\x81\xc3\x89\xc3\x8d\xc3\x93\xc3\x9a\xc3\xa1\xc3\xa9\xc3\xad\xc3\xb3\xc3\xba\xc3\xa3\xc3\xb5\xc3\x83\xc3\x95\xc3\xa2\xc3\xaa\xc3\xb4\xc3\x82\xc3\x8a\xc3\x94 ]+$\')).required(),\n email: Joi.string().email().required(),\n password: Joi.string().min(8).max(40).required()\n});\nRun Code Online (Sandbox Code Playgroud)\n但出于身份验证的目的,我只想验证email和password,忽略name。是否可以在不创建不同模式的情况下执行此操作?
众所周知,在 Cypress 中我们可以在文件中定义自定义命令commands.js,语法如下:
Cypress.Commands.add('login', (email, pw) => {})
Cypress.Commands.overwrite('visit', (orig, url, options) => {})
Run Code Online (Sandbox Code Playgroud)
然后,这些命令将在我们的所有测试中可用,并且可以从cy对象中使用。
cy.login('my@email.com', '123456')
cy.visit('www.stackoverflow.com', 'www.google.com', { redirect: true })
Run Code Online (Sandbox Code Playgroud)
但我不明白它的要点。当你可以编写一个常规函数时,这样做有什么意义呢?
function login(email, pw) { /* ... */ }
login('my@email.com', '123456')
Run Code Online (Sandbox Code Playgroud)
我看到的唯一优点是使该函数在任何地方都可用,而无需导出/导入它,但您也可以使用全局变量来做到这一点。是这样吗,还是我错过了什么?
我正在使用一个 API,该 API 公开了一个方法,该方法可以从两个不同的类之一返回一个对象,比如说,Car或者Bike. 也就是说,该方法将具有以下签名:
getVehicle(): Car | Bike
现在假设在特定情况下,我确定此方法将返回Car,因此我可以调用getVehicle().fillTank(),该方法仅在Car. 但是 TypeScript 不会让我这样做,因为它认为这个对象也可能是一个Bike,在这种情况下它不会有fillTank()方法。
它不会让我投来Car既,如const car: Car = getVehicle();因为某些Car的属性中缺少Bike。这个问题有什么解决方法吗?