我有一个使用 Vite 配置的 React 项目。
热重载效果很好,但我使用react-i18next
多语言支持,这是我的结构:
public
-> en
-> translation.json
-> ru
-> translation.json
Run Code Online (Sandbox Code Playgroud)
当我更改translation.json
文件时,Vite不看,我必须刷新页面才能看到更改。
有没有办法让Vite查看public
目录下的所有文件?
我是 Recoil.js 的新手,我在应用程序中为登录用户提供了以下原子和选择器:
const signedInUserAtom = atom<SignedInUser | null>({
key: 'signedInUserAtom',
default: null
})
export const signedInUserSelector = selector<SignedInUser | null>({
key: 'signedInUserSelector',
get: ({ get }) => get(signedInUserAtom),
set: ({ set, get }, newUserValue) => {
// ... Do a bunch of stuff when a user signs in ...
set(signedInUserAtom, newUserValue)
}
})
Run Code Online (Sandbox Code Playgroud)
所以基本上我用它signedInUserSelector
来设置新用户。
现在,我想要一些函数可以通过选择器设置用户,并在我的组件中使用它们,例如:
export async function signInWithGoogleAccount() {
const googleUser = async googleClient.signIn()
// here I need to set the user atom like:
// const …
Run Code Online (Sandbox Code Playgroud) 我有以下动态导入代码来在运行时导入 js 库:
export class AuthService {
constructor() {
import('https://apis.google.com/js/platform.js').then(result => {
console.log(result)
})
}
}
Run Code Online (Sandbox Code Playgroud)
然而,当我尝试构建/服务 Angular 项目时,我得到:
外部“https://apis.google.com/js/platform.js” - 错误:目标环境不支持动态 import() 语法,因此无法在脚本中使用外部类型“模块” 您的意思是构建 EcmaScript 模块('output.module: true')?
我尝试添加"type": "module"
inpackage.json
和"module": "ESNext"
in tsconfig.json
,但没有成功。
我怎样才能解决这个问题?
我正在使用 NestJs 在 Node.js 应用程序中实现忘记/重置密码功能。
这就是一般流程:
example.com/reset/generated_jwt_token
)example.com/reset/generated_jwt_token
:)这种方法的主要问题是 jwt 令牌可以无限次地使用来重置密码(直到 X 分钟后过期)。
有办法解决这个问题吗?有人说将当前密码的哈希值作为有效负载,因为它无论如何都会被更改并保证 1 次使用,但我不喜欢这种方法。
编辑:我遇到的另一种方法是在 jwt 令牌的数据库中创建一个黑名单集合,该集合不能多次使用。或者以同样的方式在redis中使用缓存,但似乎扩展性不太好。
我有以下切片:
export const authenticationSlice = createSlice({
name: 'authentication',
initialState: {
isFirstTimeLoading: true,
signedInUser: null
},
reducers: {
signOut: (state) => {
state.signedInUser = null
},
setUserAfterSignIn: (state, action: PayloadAction<SignInResult>) => {
// some logic...
state.signedInUser = {...}
}
},
extraReducers: builder => {
// Can I subscribe to signedInUser changes here?
}
})
Run Code Online (Sandbox Code Playgroud)
有什么方法可以在内部发生变化时订阅signedInUser
(setUserAfterSignIn
和signOut
)extraReducers
?
例如,每次setUserAfterSignIn
调度操作时,我想在 axios 中添加一个拦截器,该拦截器使用用户的 accessToken 作为 Auth 标头。
我也可以从另一个切片订阅这个状态吗?如果不同切片中的某些状态取决于signedInUser
?
编辑:这是登录用户和注销用户的重击
export const { signOut: signOutAction, …
Run Code Online (Sandbox Code Playgroud) 我有一个 Create React 应用程序,已迁移到 Vite。
我用socket.io-client
。
除了捆绑程序之外,该应用程序的两个版本完全相同(只需复制/粘贴)。
这是我的 websocket 连接
import { io } from 'socket.io-client'
export function App() {
useEffect(() => {
io('http://my-server')
})
}
Run Code Online (Sandbox Code Playgroud)
在 webpack 版本中,我可以在网络选项卡中看到 socket.io 正在尝试连接。
但在 vite 版本中却没有,甚至不会抛出错误。
我怎样才能解决这个问题?这和Vite只支持ESM包而不支持CommonJS有什么关系吗?
我有一个 NestJS 后端,它公开以下 API:
@Post('sign-in-with-google-account')
async signInWithGoogleAccount(
@Body body: { idToken: string },
@Res({ passthrough: true }) response: Response
) {
const user = await getUserFromGoogleIdToken(body.idToken)
const tokens = await generateAccessAndRefreshTokensForUser(user)
response.cookie('refreshToken', tokens.refreshToken, {
httpOnly: true,
expires: new Date(tokenExpirationDate),
secure: true,
sameSite: 'none'
})
return { accessToken: tokens.accessToken }
}
Run Code Online (Sandbox Code Playgroud)
它从 google oauth 接收 id 令牌,在数据库中查找用户并签署 JWT 访问令牌和刷新令牌。刷新令牌存储为httpOnly
cookie,并返回访问令牌。
现在,在我配置的 next.js 应用程序中,next-auth
我有以下内容:
import GoogleProvider from "next-auth/providers/google";
...
providers: [
GoogleProvider({
clientId: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET
})
]
... …
Run Code Online (Sandbox Code Playgroud) 我有一个应用程序,在其中管理categories
和subcategories
。
所以每次我删除一个 时category
,我都会有一个 mongoose 中间件来删除所有subcategories
属于它的人。
schema.post('findOneAndDelete',
(category: CategoryDocument) => subcategoryModel.deleteMany({ category: category.id }))
Run Code Online (Sandbox Code Playgroud)
当我只删除一个时效果很好category
,当我删除多个时会发生什么?
我尝试注册一个deleteMany
中间件,如下所示:
schema.post('deleteMany',
(deletedQueryResult: any) => {})
Run Code Online (Sandbox Code Playgroud)
但deleteMany
中间件只是将查询结果发送到我的回调(所花费的时间、已删除文档的数量和一些内部 mongoose/mongodb 属性)。
无论如何,我可以在猫鼬中间件中获取已删除的文档或其 ID 吗?
如果不是,我还有什么其他选择?
我有一个mat-card
内部组件模板:
<mat-card *ngFor="let p of products" (click)="viewProduct(p)">
<mat-card-actions>
<button mat-stroked-button (click)="addProductToCart(p)">Add to cart</button>
</mat-card-actions>
</mat-card>
Run Code Online (Sandbox Code Playgroud)
问题是,当单击按钮 angular 时,会同时调用addProductToCart
和viewProduct
。
我怎样才能防止这种情况?
我目前有这种类型:
type ReturnType<T, E> = [T, E]
Run Code Online (Sandbox Code Playgroud)
我试图通过以下规则使这种类型“更聪明”:
T
是undefined
,那么类型将是[undefined, E]
E
是undefined
,那么类型将是[T]
T
并且E
不能两者都是undefined
我正在尝试使用 Typescript 应用这些规则Conditional Types
。
这有可能实现吗?
这是我到目前为止得到的:
type ReturnType<T, E> =
T extends undefined
? E extends undefined ? never : [undefined, E]
: E extends undefined ? [T] : never
Run Code Online (Sandbox Code Playgroud) 我有一个需要在运行时请求权限的应用程序。
我进行了搜索,但找不到有关如何在 Jetpack Compose 中执行此操作的解决方案。
如何在运行时从@Composable
函数请求/检查权限?(我的函数嵌套得很深,所以我无法访问活动实例)
我想要这样的东西:
@Composable()
fun test() {
val hasPermission = checkPermission("READ_CONTACTS")
if (hasPermission)
LoadData()
else
requestPermission("READ_CONTACTS")
}
Run Code Online (Sandbox Code Playgroud)