Kotti Next:Kotti CMS的精神继承者,调试代码(使用WorkBuddy AI自动编程)前端未调通,重新生成一个更加轻型的前端

Kotti Next:Kotti CMS的精神继承者,调试代码(使用WorkBuddy AI自动编程)前端未调通,重新生成一个更加轻型的前端

前面使用WorkBuddy AI自动编程写了Kotti Next这个项目:https://blog.ZEEKLOG.net/skywalk8163/article/details/159729287

repo:https://gitcode.com/skywalk163/kottinext

现在进行代码测试。

先上结论:后端调调通了,前端未调通,准备重新生成一个更加轻型的前端

先安装服务器

### Installation ```bash # Create virtual environment python -m venv .venv source .venv/bin/activate # Linux/Mac .venv\Scripts\activate # Windows # Install dependencies pip install -e ".[dev]" ``` ### Initialize Database ```bash kotti-next init ``` This will: - Create the database tables - Create an admin user (username: `admin`, password: `admin`) ### Run Development Server ```bash kotti-next dev ``` Or with auto-reload: ```bash kotti-next dev --reload ```

对于我的系统,代码在这个目录:c:\Users\Admin\WorkBuddy\20260330150804\backend>

发现没有数据库初始化这条命令啊

(.venv) c:\Users\Admin\WorkBuddy\20260330150804\backend>kotti-next init Usage: kotti-next [OPTIONS] COMMAND [ARGS]... Try 'kotti-next --help' for help. Error: No such command 'init'.

原来是这条命令:

kotti-next db init

执行后报错:

(.venv) c:\Users\Admin\WorkBuddy\20260330150804\backend>kotti-next db init → Creating database tables… Traceback (most recent call last): File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 516, in _resolve_name rval = d[token] ~^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\util\_collections.py", line 340, in __missing__ self[key] = val = self.creator(key) ^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 484, in _access_cls return self.fallback[key] ~~~~~~~~~~~~~^^^^^ KeyError: 'Webhook' The above exception was the direct cause of the following exception: Traceback (most recent call last): File "<frozen runpy>", line 198, in _run_module_as_main File "<frozen runpy>", line 88, in _run_code File "G:\workbuddy\.venv\Scripts\kotti-next.exe\__main__.py", line 5, in <module> File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1485, in __call__ return self.main(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1406, in main rv = self.invoke(ctx) ^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1873, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1873, in invoke return _process_result(sub_ctx.command.invoke(sub_ctx)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 1269, in invoke return ctx.invoke(self.callback, **ctx.params) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\click\core.py", line 824, in invoke return callback(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\Admin\WorkBuddy\20260330150804\backend\kotti_next\cli\db.py", line 99, in init asyncio.run(_run()) File "E:\py312\Lib\asyncio\runners.py", line 195, in run return runner.run(main) ^^^^^^^^^^^^^^^^ File "E:\py312\Lib\asyncio\runners.py", line 118, in run return self._loop.run_until_complete(task) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "E:\py312\Lib\asyncio\base_events.py", line 691, in run_until_complete return future.result() ^^^^^^^^^^^^^^^ File "C:\Users\Admin\WorkBuddy\20260330150804\backend\kotti_next\cli\db.py", line 72, in _run await session.execute( File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\ext\asyncio\session.py", line 449, in execute result = await greenlet_spawn( ^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\util\_concurrency_py3k.py", line 203, in greenlet_spawn result = context.switch(value) ^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2351, in execute return self._execute_internal( ^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\session.py", line 2249, in _execute_internal result: Result[Any] = compile_state_cls.orm_execute_statement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 306, in orm_execute_statement result = conn.execute( ^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1419, in execute return meth( ^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 527, in _execute_on_connection return connection._execute_clauseelement( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\engine\base.py", line 1633, in _execute_clauseelement compiled_sql, extracted_params, cache_hit = elem._compile_w_cache( ^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 716, in _compile_w_cache compiled_sql = self._compiler( ^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\elements.py", line 324, in _compiler return dialect.statement_compiler(dialect, self, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 1461, in __init__ Compiled.__init__(self, dialect, statement, **kwargs) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 901, in __init__ self.string = self.process(self.statement, **compile_kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 947, in process return obj._compiler_dispatch(self, **kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\visitors.py", line 138, in _compiler_dispatch return meth(self, **kw) # type: ignore # noqa: E501 ^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\compiler.py", line 4807, in visit_select compile_state = select_stmt._compile_state_factory( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\sql\base.py", line 775, in create_for_statement return klass.create_for_statement(statement, compiler, **kw) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 447, in create_for_statement return cls._create_orm_context( ^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 1175, in _create_orm_context _QueryEntity.to_compile_state( File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 2628, in to_compile_state _MapperEntity( File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\context.py", line 2708, in __init__ entity._post_inspect File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\util\langhelpers.py", line 1235, in __get__ obj.__dict__[self.__name__] = result = self.fget(obj) ^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2733, in _post_inspect self._check_configure() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2410, in _check_configure _configure_registries({self.registry}, cascade=True) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 4227, in _configure_registries _do_configure_registries(registries, cascade) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 4268, in _do_configure_registries mapper._post_configure_properties() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\mapper.py", line 2427, in _post_configure_properties prop.init() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\interfaces.py", line 595, in init self.do_init() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\relationships.py", line 1655, in do_init self._setup_entity() File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\relationships.py", line 1865, in _setup_entity self._clsregistry_resolve_name(argument)(), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 520, in _resolve_name self._raise_for_name(name, err) File "G:\workbuddy\.venv\Lib\site-packages\sqlalchemy\orm\clsregistry.py", line 501, in _raise_for_name raise exc.InvalidRequestError( sqlalchemy.exc.InvalidRequestError: When initializing mapper Mapper[Principal(principals)], expression 'Webhook' failed to locate a name ('Webhook'). If this is a class name, consider adding this relationship() to the <class 'kotti_next.models.principal.Principal'> class after both dependent classes have been defined.

AI去搞定

搞定之后,发现数据库这块还是有问题,让AI来搞定吧:

让AI解决数据库方面的问题

你的测试包含了数据库这块吗? 怎么还有一些问题。比如:  File "C:\Users\Admin\WorkBuddy\20260330150804\backend\kotti_next\cli\db.py", line 96, in _run
    await close_db()
          ^^^^^^^^
UnboundLocalError: cannot access local variable 'close_db' where it is not associated with a value

请添加数据库的测试部分,尽量覆盖全面。并解决测试中碰到的相关问题。

AI搞定,数据库初始化问题解决

(.venv) c:\Users\Admin\WorkBuddy\20260330150804\backend>kotti-next db init → Creating database tables… Admin user already exists, skipping ✓ Initialisation complete

前端测试报错

在前端目录,执行命令

node node_modules/vitest/vitest.mjs run --reporter=verbose
c:\Users\Admin\WorkBuddy\20260330150804\frontend>node node_modules/vitest/vitest.mjs run --reporter=verbose RUN v4.1.2 c:/Users/Admin/WorkBuddy/20260330150804/frontend ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Failed Suites 6 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ FAIL tests/api/auth.test.ts [ tests/api/auth.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/api/auth.test.ts:22:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/6]⎯ FAIL tests/api/client.test.ts [ tests/api/client.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/api/client.test.ts:55:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯ FAIL tests/api/nodes.test.ts [ tests/api/nodes.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/api/nodes.test.ts:28:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/6]⎯ FAIL tests/stores/auth.test.ts [ tests/stores/auth.test.ts ] FAIL tests/stores/content.test.ts [ tests/stores/content.test.ts ] Error: Cannot find module './use-config' Require stack: - c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\_mixins\index.js - c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\src\Affix.js - c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\index.js ❯ Object.<anonymous> node_modules/naive-ui/lib/_mixins/index.js:7:20 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Serialized Error: { code: 'MODULE_NOT_FOUND', requireStack: [ 'c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\_mixins\index.js', 'c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\src\Affix.js', 'c:\Users\Admin\WorkBuddy\20260330150804\frontend\node_modules\naive-ui\lib\affix\index.js' ] } ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/6]⎯ FAIL tests/stores/ui.test.ts [ tests/stores/ui.test.ts ] TypeError: Cannot read properties of undefined (reading 'config') ❯ tests/stores/ui.test.ts:5:1 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/6]⎯ Test Files 6 failed (6) Tests no tests Start at 22:37:15 Duration 6.72s (transform 669ms, setup 1.86s, import 0ms, tests 0ms, environment 27.07s)

AI说搞定了,问题是我测试下来还是报错

升级naive-ui到最新版试试

npm install naive-ui@latest 

降级到2.38.1试试

npm install [email protected]

奇了怪了,版本就是不动,后来用npm ls naive-ui,发现版本是变了

c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm view naive-ui version 2.44.1 c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm uninstall naive-ui removed 21 packages in 12s 168 packages are looking for funding run `npm fund` for details c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm install [email protected] added 21 packages in 31s 169 packages are looking for funding run `npm fund` for details c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm view naive-ui version 2.44.1 c:\Users\Admin\WorkBuddy\20260330150804\frontend>npm ls naive-ui [email protected] c:\Users\Admin\WorkBuddy\20260330150804\frontend `-- [email protected]

结果还是一样的报错,也许不是版本的问题吧。

AI DuMate进行分析

单独运行 ui.test.ts 成功了!这说明问题出在并行运行多个测试文件时的冲突。让我逐个运行其他测试文件:


所有测试文件单独运行都能通过!这确认了问题是并行运行时的冲突。
所有测试文件单独运行都通过了!问题确认是并行运行时的 mock 冲突。

问题分析

根本原因:vitest 4.x 在并行运行多个测试文件时,不同测试文件中的 vi.mock() 会相互干扰。

具体来说:多个测试文件(auth.test.tsclient.test.tsnodes.test.ts 等)都对 @/api/client 和 axios 进行了 mock并行运行时,这些 mock 会相互覆盖或冲突导致某些测试文件在加载模块时获取到了错误的 mock 实例,从而抛出 Cannot read properties of undefined (reading 'config') 错误解决方案

在 vitest.config.ts 中添加了 fileParallelism: false 配置:

这样测试文件会顺序执行,避免了 mock 冲突。后续优化建议

如果你想恢复并行执行以加快测试速度,可以考虑:统一 mock 设置:将共享的 mock(如 @/api/client)移到 tests/setup.ts 中统一管理使用 vi.resetModules():在每个测试文件的 beforeEach 中重置模块缓存隔离 mock 作用域:确保每个测试文件的 mock 不会影响其他文件

按照DuMate的修改建议,在vtest.config.ts文件中加入

 // 禁用并行执行以避免 mock 冲突 fileParallelism: false,

但是还是一样的报错信息:

 FAIL  tests/stores/content.test.ts [ tests/stores/content.test.ts ]
TypeError: Cannot read properties of undefined (reading 'config')
 ❯ tests/stores/content.test.ts:42:1

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/6]⎯

 FAIL  tests/stores/ui.test.ts [ tests/stores/ui.test.ts ]
TypeError: Cannot read properties of undefined (reading 'config')
 ❯ tests/stores/ui.test.ts:5:1

改在ubuntu下测试

怀疑是windows的干扰,改在ubuntu下测试,还是报错,但是报错信息不一样了:

ubuntu下的报错

skywalk@DESKTOP-9C5AU01:/mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend$ node node_modules/vitest/vitest.mjs run --reporter=verbose
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯

Vitest caught 6 unhandled errors during the test run.
This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected.

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/auth.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/client.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/nodes.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/stores/auth.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/stores/content.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7


⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/stores/ui.test.ts.
 ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94
 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5

Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond
 ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58
 ❯ listOnTimeout node:internal/timers:594:17
 ❯ processTimers node:internal/timers:529:7

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯


 Test Files  no tests
      Tests  no tests
     Errors  6 errors
   Start at  07:46:12
   Duration  360.12s (transform 0ms, setup 0ms, import 0ms, tests 0ms, environment 0ms)

文心的回答

在 Ubuntu 下运行 Vitest 时遇到 [vitest-pool]: Failed to start forks worker for test files,Timeout waiting for worker to respond 错误,通常与 Worker 进程启动超时或环境配置有关。可以尝试以下解决方案:

  1. 检查系统资源‌:
    在 Ubuntu 环境中,确保系统有足够的内存和 CPU 资源供 Vitest 启动多个 Worker 进程。如果资源紧张,可能导致 Worker 启动缓慢或失败。
  2. 禁用 Worker 池‌:
    如果问题持续存在,可以暂时禁用 Worker 池,使用单线程运行测试:npx vitest run --threads=false
  3. 更新 Vitest 和相关依赖‌:
    确保使用的 Vitest 版本是最新的,或者至少是稳定版本,以避免已知的 Worker 启动问题。
  4. 检查环境变量和权限‌:
    确保在 Ubuntu 环境中,Vitest 能够正确访问所需的环境变量和文件权限,尤其是当测试涉及文件系统或网络请求时。

增加超时时间‌:
如果 Worker 启动时间较长,可以尝试增加超时设置,例如:

export default defineConfig({ test: { pool: 'forks', poolOptions: { forks: { maxConcurrency: 1, }, }, }, }) 

切换进程池类型‌:
尝试将 vitest 的进程池类型从默认的 threads 切换为 forks,以避免与 Node.js 的 fetch API 或 abort controller 的兼容性问题。在 vitest.config.ts 中添加以下配置:

export default defineConfig({ test: { pool: 'forks', // 或 'vmForks' }, }) 

这种方法可以绕过 threads 池可能存在的兼容性问题,

尝试禁用Worker池报错

用这条命令报错

node node_modules/vitest/vitest.mjs run --reporter=verbose --threads=false

报错信息

skywalk@DESKTOP-9C5AU01:/mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend$ node node_modules/vitest/vitest.mjs run --reporter=verbose --threads=false file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:406 throw new CACError(`Unknown option \`${name.length > 1 ? `--${name}` : `-${name}`}\``); ^ CACError: Unknown option `--threads` at Command.checkUnknownOptions (file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:406:17) at CAC.runMatchedCommand (file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:606:13) at CAC.parse (file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/chunks/cac.DRKYQDPl.js:547:12) at file:///mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/node_modules/vitest/dist/cli.js:11:13 at ModuleJob.run (node:internal/modules/esm/module_job:271:25) at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:578:26) at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:116:5) Node.js v22.14.0

据说新版本没有--threads指令。可以用--pool=forks这个指令。

用--pool=forks这个指令后有新的报错

skywalk@DESKTOP-9C5AU01:/mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend$ node node_modules/vitest/vitest.mjs run --reporter=verbose --pool=forks RUN v4.1.2 /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Errors ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Vitest caught 6 unhandled errors during the test run. This might cause false positive tests. Resolve unhandled errors to make sure your tests are not affected. ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Unhandled Error ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ Error: [vitest-pool]: Failed to start forks worker for test files /mnt/c/Users/Admin/WorkBuddy/20260330150804/frontend/tests/api/auth.test.ts. ❯ node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:94 ❯ Pool.schedule node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3450:5 Caused by: Error: [vitest-pool-runner]: Timeout waiting for worker to respond ❯ Timeout.<anonymous> node_modules/vitest/dist/chunks/cli-api.Bxr1Nn49.js:3030:58 ❯ listOnTimeout node:internal/timers:594:17 ❯ processTimers node:internal/timers:529:7

看来是时间超时了。

尝试增加超时

export default defineConfig({ test: { pool: 'forks', poolOptions: { forks: { maxConcurrency: 1, }, }, }, }) 

没看懂,这里怎么就增加超时了?所以我没有去改它。

最终我是让WorkBuddy去做一个新的更轻型的前端。

尝试修改配置文件

修改了又注释掉了,直接用--pool=forks就行了。

 // 将 vitest 的进程池类型从默认的 threads 切换为 forks pool: 'forks',

决定让WorkBuddy去做一个新的更轻型的前端

我前端测试的时候,还是有报错,好像跟进程池有关系。为什么你的测试就没有报错?是不是vite是比较重的框架?帮我找一个相对更加轻型的前端(因为kotti就是轻型框架),做kotti-next的新前端,放置在tinyfrontend目录。同时写好全面测试的代码。

Read more

把 Vivado 项目放心交给 Git:一篇 FPGA 工程师必读的实战指南

之前分享过一篇文章《FPGA 版本管理三种方式:你会选哪一种?》,评论区很多人都推荐使用Git进行版本管理,今天这篇文章主题就是使用Git进行备份指南。 在 FPGA 开发中,掌握 Git 等源码管理工具已经是必备技能。 当然,在使用 Vivado 时,我们不仅需要处理源代码控制,还需要处理以 IP 为中心的设计产品。 Vivado 的工程通常是 IP 为中心 的设计,包含: * IP Integrator Block Diagram * 各类 IP 实例(独立 IP 或 BD 内 IP) * 自动生成的包装文件与工程产物 这让很多 FPGA 工程师一开始会觉得: “Vivado 项目到底该怎么和 Git 一起用?” 好消息是,从 Vivado

政安晨【零基础玩转开源AI项目】OpenClaw飞书通信端机器人配置指南(手把手配置OpenClaw飞书/Lark机器人,实现多渠道AI助手集成)(作者自己配置时留存使用,小伙伴们可酌情参考)

政安晨【零基础玩转开源AI项目】OpenClaw飞书通信端机器人配置指南(手把手配置OpenClaw飞书/Lark机器人,实现多渠道AI助手集成)(作者自己配置时留存使用,小伙伴们可酌情参考)

政安晨的个人主页:政安晨 欢迎 👍点赞✍评论⭐收藏 希望政安晨的博客能够对您有所裨益,如有不足之处,欢迎在评论区提出指正! 目录 一、前言 1.1 为什么需要配置飞书机器人? 1.2 飞书机器人支持的功能 二、准备工作 2.1 环境要求 2.2 OpenClaw安装(本篇主要介绍飞书端的配置,这里可参考我上一篇博客) 2.3 飞书账号要求 三、飞书应用创建 3.1 创建企业应用 3.2 获取应用凭证 编辑3.3 开通权限 3.4 配置事件订阅 Webhook URL配置 订阅事件 3.5

AstrBot+NapCat 一键部署 5 分钟搞定智能 QQ 机器人!cpolar解决公网访问 :cpolar 内网穿透实验室第 777 个成功挑战

AstrBot+NapCat 一键部署 5 分钟搞定智能 QQ 机器人!cpolar解决公网访问 :cpolar 内网穿透实验室第 777 个成功挑战

这篇教程会带你用最简单的方式:**只用一份 docker-compose,一次命令,5 分钟以内完成 AstrBot + NapCat 部署,把 DeepSeekAI 接入你的 QQ。**AstrBot 本身就是为 AI 而生的现代化机器人框架,插件丰富、支持 DeepSeek/OpenAI 等大模型、带 WebUI、可扩展性强,真正做到"搭好就能用"。照着做,你马上就能拥有属于自己的 QQ AI 机器人。 1 项目介绍 1.1 AstrBot是什么? GitHub 仓库:https://github.com/AstrBotDevs/AstrBot AstrBot 是一个专为 AI 大模型设计的开源聊天机器人框架,

Flutter 三方库 discord_interactions 的鸿蒙化适配指南 - 在 OpenHarmony 打造高效的社交机器人交互底座

Flutter 三方库 discord_interactions 的鸿蒙化适配指南 - 在 OpenHarmony 打造高效的社交机器人交互底座

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 discord_interactions 的鸿蒙化适配指南 - 在 OpenHarmony 打造高效的社交机器人交互底座 在现代社交应用与办公协同工具的开发中,集成强大的机器人(Bot)交互能力是提升活跃度的关键。discord_interactions 库为 Flutter 开发者提供了一套完整的、遵循 Discord 官方协议的交互模型,涵盖了从 Slash Commands(斜杠命令)到 Webhook 签名验证的核心功能。本文将深入解析如何在 OpenHarmony(鸿蒙)环境下,结合鸿蒙的安全机制与网络特性,完美适配 discord_interactions 到你的鸿蒙应用中。 前言 随着鸿蒙系统(HarmonyOS)进入原生应用开发的新纪元,跨平台社交工具的适配需求日益增长。discord_interactions 作为一个纯