fix(editor): 删文章 EXDEV 修正 + 订阅口令不再阻断登录
1) 删除文章报 EXDEV(cross-device link not permitted)
· 根因一:容器内 /blog 与 /app/trash 是两个独立 bind mount,
rename(2) 跨挂载点必然 EXDEV —— 哪怕宿主机上它们同在一块盘。
· 根因二:退化成 fs.cpSync 后,Windows 上遇到**中文目录名**会把
Node 进程直接干崩(exit 127,不抛异常,stdout 缓冲丢失)。
而文章目录名几乎必然含中文(<日期>-<中文标题>-<slug>)。
· 修法:改用 readdirSync/copyFileSync 自己递归复制(宽字符路径,中文 OK);
bootstrap.sh / compose 改成挂 BLOG_DIR 的父目录,让仓库与回收站
落在**同一个挂载点**内,正常情况下 rename 直接成功、不再复制。
2) 登录页「订阅口令」填错会阻断整个登录
· 它只是可选订阅模块的口令,不该 throw 掉登录流程。
· rssApi() 无条件 searchParams.set('token', RSS_TOKEN),会用浏览器里
记住的旧口令覆盖调用方刚传的值 → 正确口令也验不过。
· 现在:填错只 toast 提示 + 清掉失效旧口令;rssApi 尊重调用方传的值。
3) wrangler.toml:EDITOR_API_BASE 改指国内机新域名 writeapi.usj.cc
(原指向即将到期的境外机 post.usj.cc,且那台从未部署过 editor-api)
验证:api-e2e 44/44;front matter 往返 130/130;保存往返 130/130;
中文路径删除实测通过(目录 + 中文子目录 + 图片全部移入回收站,进程不崩)。
This commit is contained in:
1 parent
e8d13b9a6e
commit
96751b8143
5 files changed
+98
-18
No files matched your search
@@ -136,7 +136,9 @@ let RSS_TOKEN = localStorage.getItem(LS_RSS) || '';
|
||||
async function rssApi(path, opt) {
|
||||
opt = opt || {};
|
||||
const u = new URL(RSS_API + path);
|
||||
if (RSS_TOKEN) u.searchParams.set('token', RSS_TOKEN);
|
||||
// 调用方显式带了 token 就用它,否则补本地记住的口令。
|
||||
// (以前无条件 set 会覆盖调用方传的值,导致「刚输入的口令被旧口令盖掉」)
|
||||
if (!u.searchParams.get('token') && RSS_TOKEN) u.searchParams.set('token', RSS_TOKEN);
|
||||
|
||||
const headers = {};
|
||||
if (opt.body !== undefined) headers['Content-Type'] = 'application/json';
|
||||
@@ -1871,13 +1873,24 @@ $('#loginForm').addEventListener('submit', async (e) => {
|
||||
state.me = state.me || {};
|
||||
if (state.me.is_admin === false) throw new Error('该账号不是管理员');
|
||||
|
||||
// 订阅口令:填了就验证并存下,没填就清空(订阅模块会提示未配置)
|
||||
// 订阅口令是**可选**的:填了就验证,错了只影响订阅模块,绝不阻断登录
|
||||
const rssPwd = $('#lgRss') ? $('#lgRss').value.trim() : '';
|
||||
if (rssPwd) {
|
||||
const ok = await rssApi('/api/auth?token=' + encodeURIComponent(rssPwd));
|
||||
if (!ok || ok.ok !== true) throw new Error('订阅口令错误');
|
||||
RSS_TOKEN = rssPwd;
|
||||
localStorage.setItem(LS_RSS, rssPwd);
|
||||
// 直接验证刚输入的口令(不走 rssApi,避免被本地记住的旧口令覆盖)
|
||||
let rssOk = false;
|
||||
try {
|
||||
const r = await fetch(RSS_API + '/api/auth?token=' + encodeURIComponent(rssPwd));
|
||||
const d = await r.json().catch(() => null);
|
||||
rssOk = !!(d && d.ok === true);
|
||||
} catch (e) { rssOk = false; }
|
||||
if (rssOk) {
|
||||
RSS_TOKEN = rssPwd;
|
||||
localStorage.setItem(LS_RSS, rssPwd);
|
||||
} else {
|
||||
RSS_TOKEN = '';
|
||||
localStorage.removeItem(LS_RSS);
|
||||
setTimeout(() => toast('订阅口令不正确,已跳过订阅模块(不影响其它功能)', true), 400);
|
||||
}
|
||||
} else {
|
||||
RSS_TOKEN = localStorage.getItem(LS_RSS) || '';
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user