小编Two*_*ses的帖子

如何查看Vite项目中的公共目录进行热加载?

我有一个使用 Vite 配置的 React 项目。
热重载效果很好,但我使用react-i18next多语言支持,这是我的结构:

public
  -> en
    -> translation.json
  -> ru
    -> translation.json
Run Code Online (Sandbox Code Playgroud)

当我更改translation.json文件时,Vite不看,我必须刷新页面才能看到更改。

有没有办法让Vite查看public目录下的所有文件?

javascript typescript reactjs vite

17
推荐指数
2
解决办法
1万
查看次数

如何在组件外部更新 Recoil.js 中的原子(状态)?(反应)

我是 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)

javascript node.js typescript reactjs recoiljs

16
推荐指数
2
解决办法
1万
查看次数

(Angular 12) 目标环境不支持动态 import() 语法,因此无法在脚本中使用外部类型“模块”

我有以下动态导入代码来在运行时导入 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')?

此外,vs-code 还强调了import以下内容:
在此输入图像描述

我尝试添加"type": "module"inpackage.json"module": "ESNext"in tsconfig.json,但没有成功。

我怎样才能解决这个问题?

javascript typescript webpack angular

8
推荐指数
1
解决办法
8544
查看次数

如何在 Node.js 中正确实现“忘记/重置密码”功能?(使用一次性令牌)

我正在使用 NestJs 在 Node.js 应用程序中实现忘记/重置密码功能。

这就是一般流程:

  1. 用户在“忘记密码”表单中输入电子邮件并提交请求
  2. 服务器生成一个以用户 ID 作为负载的 jwt 令牌,然后发送一封包含该令牌作为重置密码链接的电子邮件(例如: GET: example.com/reset/generated_jwt_token
  3. 用户单击电子邮件中的链接,呈现重置密码页面,他使用新密码填写表单并以密码作为正文提交表单(例如:POST example.com/reset/generated_jwt_token:)
  4. 服务器验证令牌(未过期+有效负载中的用户 ID 存在于数据库中)并更新密码。

这种方法的主要问题是 jwt 令牌可以无限次地使用来重置密码(直到 X 分钟后过期)。

有办法解决这个问题吗?有人说将当前密码的哈希值作为有效负载,因为它无论如何都会被更改并保证 1 次使用,但我不喜欢这种方法。

编辑:我遇到的另一种方法是在 jwt 令牌的数据库中创建一个黑名单集合,该集合不能多次使用。或者以同样的方式在redis中使用缓存,但似乎扩展性不太好。

javascript security forgot-password node.js jwt

7
推荐指数
1
解决办法
1万
查看次数

如何在 Redux Toolkit 中订阅 React 组件之外的状态?

我有以下切片:

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)

有什么方法可以在内部发生变化时订阅signedInUsersetUserAfterSignInsignOutextraReducers

例如,每次setUserAfterSignIn调度操作时,我想在 axios 中添加一个拦截器,该拦截器使用用户的 accessToken 作为 Auth 标头。

我也可以从另一个切片订​​阅这个状态吗?如果不同切片中的某些状态取决于signedInUser

编辑:这是登录用户和注销用户的重击

export const { signOut: signOutAction, …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs redux react-redux redux-toolkit

7
推荐指数
1
解决办法
6661
查看次数

与 Vite 捆绑的 React 应用程序中的 Socket.IO 不起作用(与 Webpack 捆绑时可以)

我有一个 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有什么关系吗?

javascript socket.io reactjs webpack vite

7
推荐指数
1
解决办法
1654
查看次数

Next Auth google OAuth 带有自定义后端的访问令牌和刷新令牌

我有一个 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 访问令牌和刷新令牌。刷新令牌存储为httpOnlycookie,并返回访问令牌。

现在,在我配置的 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)

javascript authentication next.js nestjs next-auth

6
推荐指数
1
解决办法
939
查看次数

如何从Mongoose中的DeleteMany中间件获取已删除的文档?

我有一个应用程序,在其中管理categoriessubcategories
所以每次我删除一个 时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 吗?
如果不是,我还有什么其他选择?

mongoose mongodb node.js

5
推荐指数
1
解决办法
3414
查看次数

点击 Angular Material's Card 内的按钮会触发卡片本身的点击事件

我有一个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 时,会同时调用addProductToCartviewProduct

我怎样才能防止这种情况?

html typescript angular-material angular

3
推荐指数
1
解决办法
1437
查看次数

如何检查 Typescript 条件类型中的类型是否未定义?

我目前有这种类型:

type ReturnType<T, E> = [T, E]
Run Code Online (Sandbox Code Playgroud)

我试图通过以下规则使这种类型“更聪明”:

  • 如果Tundefined,那么类型将是[undefined, E]
  • 如果Eundefined,那么类型将是[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)

javascript typescript

3
推荐指数
1
解决办法
2019
查看次数

如何在 Jetpack Compose 中请求权限?

我有一个需要在运行时请求权限的应用程序。
我进行了搜索,但找不到有关如何在 Jetpack Compose 中执行此操作的解决方案。

如何在运行时从@Composable函数请求/检查权限?(我的函数嵌套得很深,所以我无法访问活动实例)

我想要这样的东西:

@Composable()
fun test() {
  val hasPermission = checkPermission("READ_CONTACTS")
  if (hasPermission)
    LoadData()
  else
    requestPermission("READ_CONTACTS")
}
Run Code Online (Sandbox Code Playgroud)

android kotlin android-jetpack-compose

1
推荐指数
1
解决办法
3114
查看次数