[GH-ISSUE #207] [bug] Webdav使用InfiniCLOUD存在的问题 #159

Closed
opened 2026-03-02 03:38:07 +03:00 by kerem · 4 comments
Owner

Originally created by @wha4up on GitHub (May 21, 2025).
Original GitHub issue: https://github.com/codexu/note-gen/issues/207

详细描述这个 Bug

问题1:
使用InfiniCLOUD成功备份后,会在InfiniCLOUD按备份路径名逐字生成文件夹,直到生成全名后将文件备份到最后的文件夹。

Image

问题2:
即使已经成功(目的达成,效果有待提高)在InfiniCLOUD备份,但Webdav检测依然显示不可用。

Image

NoteGen 版本

0.16.3

操作系统

Windows

报错日志

没有。

Originally created by @wha4up on GitHub (May 21, 2025). Original GitHub issue: https://github.com/codexu/note-gen/issues/207 ### 详细描述这个 Bug 问题1: 使用InfiniCLOUD成功备份后,会在InfiniCLOUD按备份路径名逐字生成文件夹,直到生成全名后将文件备份到最后的文件夹。 ![Image](https://github.com/user-attachments/assets/5b79c4a6-55db-47ea-bcd4-e0d9f773b848) 问题2: 即使已经成功(目的达成,效果有待提高)在InfiniCLOUD备份,但Webdav检测依然显示不可用。 ![Image](https://github.com/user-attachments/assets/3daefe9e-2556-485d-aac5-c37e4c4b0ab2) ### NoteGen 版本 0.16.3 ### 操作系统 Windows ### 报错日志 没有。
kerem 2026-03-02 03:38:07 +03:00
  • closed this issue
  • added the
    bug
    label
Author
Owner

@oclld commented on GitHub (Jun 23, 2025):

Image 同样在使用nas的webdav备份时,存在同样的情况
<!-- gh-comment-id:2996802861 --> @oclld commented on GitHub (Jun 23, 2025): <img width="596" alt="Image" src="https://github.com/user-attachments/assets/eccabd86-5efb-4d05-b98c-5b84cab2fdc6" /> 同样在使用nas的webdav备份时,存在同样的情况
Author
Owner

@wha4up commented on GitHub (Jun 24, 2025):

Image 同样在使用nas的webdav备份时,存在同样的情况

我以前在其他应用上用webdav备份也碰到过同样的问题,估计是使用了相同的方式

<!-- gh-comment-id:2998792576 --> @wha4up commented on GitHub (Jun 24, 2025): > <img alt="Image" width="596" src="https://private-user-images.githubusercontent.com/22362864/457961174-eccabd86-5efb-4d05-b98c-5b84cab2fdc6.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NTA3NDA1NDgsIm5iZiI6MTc1MDc0MDI0OCwicGF0aCI6Ii8yMjM2Mjg2NC80NTc5NjExNzQtZWNjYWJkODYtNWVmYi00ZDA1LWI5OGMtNWI4NGNhYjJmZGM2LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTA2MjQlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwNjI0VDA0NDQwOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTIwZWNkNTYxNTVmYTkzZGU2NzZmMDQ4ZjcxOWZmYjJhYWM0NTlkOWNjNTQzMjc1OTE5Njg5ODIxYmEyOWQ4MTYmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.RwqrAYz4t94Qk2ry_tYaqvTugvFaDp7K_5CPqqiKXZI"> 同样在使用nas的webdav备份时,存在同样的情况 我以前在其他应用上用webdav备份也碰到过同样的问题,估计是使用了相同的方式
Author
Owner

@Lovi-github commented on GitHub (Jul 16, 2025):

同样是遇到了这样的问题

Image
<!-- gh-comment-id:3076783519 --> @Lovi-github commented on GitHub (Jul 16, 2025): 同样是遇到了这样的问题 <img width="697" height="415" alt="Image" src="https://github.com/user-attachments/assets/1690444b-3902-4e0f-b1e4-ef0c59067b3c" />
Author
Owner

@zlnox commented on GitHub (Jul 21, 2025):

你遇到的问题是:WebDAV 路径输入框每输入一个字符,WebDAV 服务器目录下就新建了一个以该字符命名的文件夹,导致路径里每一个字符都被当成文件夹创建了!

这个问题其实是无意中反复调用了webdav_test,并且webdav_test里的自动建目录的逻辑被每一轮输入都触发了。


现象的根源

前端:

你的每个 setter(如setPath)都自动调用了testConnection

setPath: async (path: string) => {
  set({ path })
  ...
  get().testConnection()
}

每输入一个字符,都会setPath,都会testConnection


后端:

testConnection其实会调用 webdav_test,而 webdav_test 逻辑如下:

match client.list(&test_path, Depth::Infinity).await {
    Ok(_) => Ok(true),
    Err(e) => {
        // 如果不存在目录则创建
        if let Err(create_err) = client.mkcol(&test_path).await {
            return Err(...);
        }
        // 再list
        ...
    }
}

问题详细说明:

  • 每输入一次,比如 "a" "b" "c",你的test_path分别是 "a"、"ab"、"abc"
  • 第一次输入"a"时:webdav_test 检查 "a",发现没有,创建了"a"
  • 下次输入"ab"时:webdav_test 检查 "ab",发现没有,创建了"ab"
  • 以此类推,就会出现以每个字符、每步字符串为名的文件夹……

彻底解决思路

1. 不要每输入一次就测试/新建目录

  • 在输入框失去焦点时再做测试(onBlur),或加一个“测试连接”“确认”按钮!
  • 或加防抖(debounce),只在停止输入一段时间后才触发 testConnection

2. webdav_test 逻辑改进:不自动新建目录

  • testConnection(webdav_test)不推荐自动 mkcol,应该只测试能否 list/访问。
  • 目录创建应该放到手动操作(比如首次同步时/点“新建”时)再做,而不是只做连接测试就新建。

推荐代码调整

A. 前端(防抖 + 不自动每字符触发)

import debounce from "lodash.debounce";

const debouncedTestConnection = debounce(() => {
  get().testConnection();
}, 1000); // 1秒

setPath: async (path: string) => {
  set({ path });
  // 不再立即 testConnection
  debouncedTestConnection();
}

或者更优方式,你在路径输入框加一个“测试按钮”:

<input ... onChange={e => setPath(e.target.value)} />
<button onClick={() => useWebDAVStore.getState().testConnection()}>测试WebDAV连接</button>

B. 后端(test 只测试不新建)

webdav_test 写成这样:

#[tauri::command]
pub async fn webdav_test(
    url: String,
    username: String,
    password: String,
    path: String,
) -> Result<bool, String> {
    let client = match create_client(&url, &username, &password) {
        Ok(client) => client,
        Err(e) => return Err(e),
    };

    let test_path = if path.starts_with('/') {
        path[1..].to_string()
    } else {
        path
    };

    // 新版:不新建目录
    match client.list(&test_path, Depth::Infinity).await {
        Ok(_) => Ok(true),
        Err(e) => Err(format!("Connection failed: {}", e)),
    }
}

真正需要自动创建目录时,比如用户首次同步数据,再判断 mkdir。


小结

  • 你的每一输入都会触发一次“连接测试”,而测试逻辑又带自动新建目录,所以服务器被输入频率“刷爆”了
  • 建议只在“点测试”或“点保存”时做连接检测
  • 不要在 testConnection 逻辑里自动新建目录,只 list 检查即可

你可以这样理解:

  • testConnection = 检查当前配置信息下,服务是否能连通(只做 list,不做 mkcol)
  • 真正需要 mkcol 的时候放到“同步”“上传”“保存目录”相关的代码逻辑

只要按上面修改,服务器就不会再无脑地每输入一个字符新建一个目录了!

如需更详细代码示例可再提问!

<!-- gh-comment-id:3095660525 --> @zlnox commented on GitHub (Jul 21, 2025): 你遇到的问题是:**WebDAV 路径输入框每输入一个字符,WebDAV 服务器目录下就新建了一个以该字符命名的文件夹,导致路径里每一个字符都被当成文件夹创建了!** 这个问题其实是无意中反复调用了`webdav_test`,并且`webdav_test`里的**自动建目录的逻辑**被每一轮输入都触发了。 --- ## 现象的根源 ### 前端: 你的每个 setter(如`setPath`)都自动调用了`testConnection`: ```ts setPath: async (path: string) => { set({ path }) ... get().testConnection() } ``` **每输入一个字符,都会`setPath`,都会`testConnection`。** --- ### 后端: `testConnection`其实会调用 webdav_test,而 webdav_test 逻辑如下: ```rust match client.list(&test_path, Depth::Infinity).await { Ok(_) => Ok(true), Err(e) => { // 如果不存在目录则创建 if let Err(create_err) = client.mkcol(&test_path).await { return Err(...); } // 再list ... } } ``` #### 问题详细说明: - **每输入一次,比如 "a" "b" "c",你的`test_path`分别是 "a"、"ab"、"abc"** - 第一次输入"a"时:webdav_test 检查 "a",发现没有,创建了"a" - 下次输入"ab"时:webdav_test 检查 "ab",发现没有,创建了"ab" - 以此类推,就会出现以每个字符、每步字符串为名的文件夹…… --- ## 彻底解决思路 ### 1. **不要每输入一次就测试/新建目录** - 在输入框**失去焦点**时再做测试(onBlur),或加一个“测试连接”“确认”按钮! - 或加**防抖(debounce)**,只在**停止输入一段时间后**才触发 `testConnection`。 ### 2. **webdav_test 逻辑改进:不自动新建目录** - testConnection(webdav_test)不推荐自动 mkcol,应该只测试能否 list/访问。 - 目录创建应该放到**手动操作**(比如首次同步时/点“新建”时)再做,而不是只做连接测试就新建。 --- ## 推荐代码调整 ### A. 前端(防抖 + 不自动每字符触发) ```ts import debounce from "lodash.debounce"; const debouncedTestConnection = debounce(() => { get().testConnection(); }, 1000); // 1秒 setPath: async (path: string) => { set({ path }); // 不再立即 testConnection debouncedTestConnection(); } ``` 或者更优方式,你在路径输入框加一个“测试按钮”: ```tsx <input ... onChange={e => setPath(e.target.value)} /> <button onClick={() => useWebDAVStore.getState().testConnection()}>测试WebDAV连接</button> ``` --- ### B. 后端(test 只测试不新建) 将 `webdav_test` 写成这样: ```rust #[tauri::command] pub async fn webdav_test( url: String, username: String, password: String, path: String, ) -> Result<bool, String> { let client = match create_client(&url, &username, &password) { Ok(client) => client, Err(e) => return Err(e), }; let test_path = if path.starts_with('/') { path[1..].to_string() } else { path }; // 新版:不新建目录 match client.list(&test_path, Depth::Infinity).await { Ok(_) => Ok(true), Err(e) => Err(format!("Connection failed: {}", e)), } } ``` 真正需要自动创建目录时,比如用户首次同步数据,再判断 mkdir。 --- ## 小结 - 你的每一输入都会触发一次“连接测试”,而测试逻辑又带自动新建目录,所以服务器被输入频率“刷爆”了 - **建议只在“点测试”或“点保存”时做连接检测** - 不要在 testConnection 逻辑里自动新建目录,只 list 检查即可 --- ### 你可以这样理解: - testConnection = 检查当前配置信息下,服务是否能连通(只做 list,不做 mkcol) - 真正需要 mkcol 的时候放到“同步”“上传”“保存目录”相关的代码逻辑 只要按上面修改,服务器就不会再无脑地每输入一个字符新建一个目录了! 如需更详细代码示例可再提问!
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
starred/note-gen#159
No description provided.