/**------【①.谋而后定:配置区】-----**/ 'use strict'; const ACCOUNT = { //账号相关,安全性更高 "user" : "admin", //博客后台用户名 "password" : "cfblog-plus", //博客后台密码 "third_token" : "cfblog", //开放token,当前仅允许访问/admin/search.xml,/admin/sitemap.xml时可用,在cfblog_token的头信息中传递 "cacheZoneId":"935xxxxxxxxxxxx",//区域 ID "cacheToken":"AQxxxxxxxx",//API token "kv_var": this['CFBLOG'],//workers绑定kv时用的变量名 } const OPT = { //网站配置 /*--前台参数--*/ "siteDomain" : "域名",// 域名(不带https 也不带/) "siteName" : "CFBLOG-Plus",//博客名称 "siteDescription":"CFBLOG-Plus" ,//博客描述 "keyWords":"cloudflare,KV,workers,blog",//关键字 "logo":"https://cdn.jsdelivr.net/gh/Arronlong/cfblog-plus@master/themes/JustNews/files/logo2.png",//JustNews主题的logo "theme_github_path":"https://cdn.jsdelivr.net/gh/Arronlong/cfblog-plus@master/themes/",//主题路径 "themeURL" : "https://raw.githubusercontent.com/Arronlong/cfblog-plus/master/themes/JustNews/", // 模板地址,以 "/"" 结尾 //"search_xml_url":"", //search.xml外部链接,可通过github的action自动生成,不设置则实时生成 //"sitemap_xml_url":"", //sitemap.xml外部链接,可通过github的action自动生成,不设置则实时生成 "pageSize" : 5,//每页文章数 "recentlySize" : 6,//最近文章数 "recentlyType" : 1,//最近文章类型:1-按创建时间倒序(按id倒序),2-按修改时间排序 "readMoreLength":150,//阅读更多截取长度 "cacheTime" : 60*60*24*2, //文章在浏览器的缓存时长(秒),建议=文章更新频率 "html404" : `404`,//404页面代码 "codeBeforHead":` `,//其他代码,显示在前 "codeBeforBody":` `,//其他代码,显示在前 "commentCode":` `,//评论区代码 "widgetOther":` `,//20201224新增参数,用于右侧 小部件扩展 "otherCodeA":`热度`,//模板开发用的其他自定义变量 "otherCodeB":``,// "otherCodeC":``,// "otherCodeD":``,// "otherCodeE":``,// "copyRight" :`Powered by Cloudflare & CFBlog-Plus & CF-Blog `,//自定义版权信息,建议保留大公无私的 Coudflare 和 作者 的链接 "robots":`User-agent: * Disallow: /admin`,//robots.txt设置 /*--前后台共用参数--*/ "top_flag":`[置顶]`,//置顶标志 "top_flag_style":``,//置顶标志的样式 /*--后台参数--*/ "hidden_flag":`[隐藏]`,//隐藏标志 "hidden_flag_style":``,//隐藏标志的样式 "admin_home_idx": 1, //后台首页tab索引设置:1-我的文章,2-新建,3-设置,4-发布 "editor_page_scripts": ` //置顶设置 let top_setting=\`
\` $('form#addNewForm div.form-group,form#editForm div.form-group').last().after(top_setting);//新建和编辑页面添加置顶设置 $("#istop").change(function(){ $("#top_timestamp").val($(this).val()*1?new Date().getTime():0); }); if(location.pathname.startsWith('/admin/edit')){//修改文章页面,自动设置置顶 $("#istop").val(articleJson.top_timestamp?1:0); $("#top_timestamp").val(articleJson.top_timestamp?articleJson.top_timestamp:0); } $("#istop").trigger('change') //隐藏设置 let hidden_setting=\`
\` $('form#addNewForm div.form-group,form#editForm div.form-group').last().after(hidden_setting);//新建和编辑页面添加隐藏设置 if(location.pathname.startsWith('/admin/edit')){//修改文章页面,自动设置隐藏 $("#hidden").val(articleJson.hidden?1:0); } let sitemapxml=\`导出sitemap.xml\` $('form#importForm a').last().after(sitemapxml);//设置页面添加导出sitemap.xml导出按钮 let searchxml=\`导出search.xml\` $('form#importForm a').last().after(searchxml);//设置页面添加导出search.xml导出按钮 //关闭email匹配和@匹配,否则图片使用jsdelivr的cdn,如果有版本号会匹配成“mailto:xxx”从而导致显示异常 mdEditor.settings.emailLink=false; mdEditor.settings.atLink=false; //mdEditor.settings.toc=false //mdEditor.settings.tocm=true // Using [TOCM] //mdEditor.settings.tocContainer="#custom-toc-container" // 自定义 ToC 容器层 //mdEditor.settings.gfm=false //mdEditor.settings.tocDropdown=true //mdEditor.settings.markdownSourceCode=true // 是否保留 Markdown 源码,即是否删除保存源码的 Textarea 标签 mdEditor.settings.emoji=true mdEditor.settings.taskList=true;// 默认不解析 mdEditor.settings.tex=true;// 默认不解析 mdEditor.settings.flowChart=true; // 默认不解析 mdEditor.settings.sequenceDiagram=true;// 默认不解析 //开启全局html标签解析-不推荐 //mdEditor.settings.htmlDecode=true; window.mdEditor=mdEditor; //editormd工具栏上添加html标签解析开关 mdEditor.getToolbarHandles().parseHtml=function(){ let ele = $(".editormd-menu li a i:last"); if(ele.hasClass('fa-toggle-off')){ ele.removeClass('fa-toggle-off').addClass('fa-toggle-on'); mdEditor.settings.htmlDecode = true; }else if(ele.hasClass('fa-toggle-on')){ ele.removeClass('fa-toggle-on').addClass('fa-toggle-off') mdEditor.settings.htmlDecode = false; } mdEditor.setMarkdown(mdEditor.getMarkdown()); } setTimeout(function(){ $(".editormd-menu").append('
  • |
  • 解析HTML标签
  • ') mdEditor.setToolbarHandler(mdEditor.getToolbarHandles()) },300) //默认图片,工具:https://tool.lu/imageholder/ if($('#img').val()=="")$('#img').val('https://cdn.jsdelivr.net/gh/Arronlong/cdn@master/cfblog/cfblog-plus.png'); //默认时间设置为当前时间 if($('#createDate').val()=="")$('#createDate').val(new Date(new Date().getTime()+8*60*60*1000).toJSON().substr(0,16)); `, //后台编辑页面脚本 }; //---对部分配置进行处理--- { //CFBLOG 通用变量 this.CFBLOG = ACCOUNT.kv_var; //默认为非私密博客 if(null==OPT.privateBlog){ OPT.privateBlog=false; } //处理themeURL、theme_github_path参数设定 if(OPT.themeURL.substr(-1)!='/'){ OPT.themeURL=OPT.themeURL+'/'; } if(OPT.theme_github_path.substr(-1)!='/'){ OPT.theme_github_path=OPT.theme_github_path+'/'; } //置顶样式对于前台来说,与codeBeforHead结合即可 if(OPT.top_flag_style){ OPT.codeBeforHead += OPT.top_flag_style } } /**------【②.猎杀时刻:请求处理入口】-----**/ //监听请求 addEventListener("fetch",event=>{ //处理请求 event.respondWith(handlerRequest(event)) }) // 处理请求 async function handlerRequest(event){ let request = event.request //获取url请求对象 let url=new URL(request.url) let paths=url.pathname.trim("/").split("/") //校验权限 if(("admin"==paths[0]||true===OPT.privateBlog) &&!parseBasicAuth(request)){ return new Response("Unauthorized",{ headers:{ "WWW-Authenticate":'Basic realm="cfblog"', "Access-Control-Allow-Origin":"*" }, status:401 }); } //组装请求url,查看是否有缓存 const D=caches.default, M="https://"+OPT.siteDomain+url.pathname, x=new Request(M, request); console.log("cacheFullPath:",M); let k=await D.match(x); if(k){ console.log("hit cache!") return k; } switch(paths[0]){ case "favicon.ico": //图标 k = await handle_favicon(request); break; case "robots.txt": k = await handle_robots(request); break; case "sitemap.xml": k = await handle_sitemap(request); break; case "search.xml": k = await handle_search(request); break; case "admin": //后台 k = await handle_admin(request); break; case "article": //文章内容页 k = await handle_article(paths[1]); break; case "": //文章 首页 case "page": //文章 分页 case "category": //分类 分页 case "tags": //标签 分页 k = await renderBlog(url); break; default: //其他页面返回404 k= new Response(OPT.html404,{ headers:{ "content-type":"text/html;charset=UTF-8" }, status:200 }) break; } //设置浏览器缓存时间:后台不缓存、只缓存前台 try{ if("admin"==paths[0]){ k.headers.set("Cache-Control","no-store") }else{ k.headers.set("Cache-Control","public, max-age="+OPT.cacheTime), event.waitUntil(D.put(M,k.clone())) } }catch(e){} return k } /**------【③.分而治之:各种请求分开处理】-----**/ //访问: favicon.ico async function handle_favicon(request){ /* 想要自定义,或者用指定的ico,可将此请求置为404,并在codeBeforHead中自行添加类似代码: */ /* return new Response("404",{ headers:{ "content-type":"text/plain;charset=UTF-8" }, status:404 }); */ let url = new URL(request.url) url.host="dash.cloudflare.com" return await fetch(new Request(url, request)); } //访问: robots.txt async function handle_robots(request){ return new Response(OPT.robots+"\nSitemap: https://"+OPT.siteDomain+"/sitemap.xml",{ headers:{ "content-type":"text/plain;charset=UTF-8" }, status:200 }); } //访问: sitemap.xml async function handle_sitemap(request){ //如果设置了参数,则使用参数指定的url //可使用github action方式自动定期更新 let xml; if(OPT.sitemap_xml_url){ //cf代理方式,速度可以,实时性更好 let url = new URL(request.url) url.href = OPT.sitemap_xml_url.replace('cdn.jsdelivr.net/gh','raw.githubusercontent.com').replace('@','/'); xml = await fetch(new Request(url, request)); xml = await xml.text(); ////302方式,如果使用jsdelivr作为cdn,速度快,但更新有延迟 //return new Response("",{ // headers:{ // "location":OPT.sitemap_xml_url // }, // status:302 //}); }else{ //未配置参数,则实时获取结构 //读取文章列表,并按照特定的xml格式进行组装 let articles_all=await getArticlesList() xml='\n'; for(var i=0;i", xml+="\n\t\t"+articles_all[i].createDate.substr(0,10)+"", xml+="\n\t\t"+(void 0===articles_all[i].changefreq?"daily":articles_all[i].changefreq)+"", xml+="\n\t\t"+(void 0===articles_all[i].priority?"0.5":articles_all[i].priority)+"", xml+="\n\t"; } xml+="\n" } return new Response(xml,{ headers:{ "content-type":"text/xml;charset=UTF-8" }, status:200 }); } //访问: search.xml async function handle_search(request){ //如果设置了参数,则使用参数指定的url //可使用github action方式自动定期更新 let xml; if(OPT.search_xml_url){ //cf代理方式,速度可以,实时性更好 let url = new URL(request.url) url.href = OPT.search_xml_url.replace('cdn.jsdelivr.net/gh','raw.githubusercontent.com').replace('@','/'); xml = await fetch(new Request(url, request)); xml = await xml.text(); ////302方式,如果使用jsdelivr作为cdn,速度快,但更新有延迟 //return new Response("",{ // headers:{ // "location":OPT.search_xml_url // }, // status:302 //}); }else{ //未配置参数,则实时获取结构 //读取文章列表,并按照特定的xml格式进行组装 let articles_all=await getArticlesList() xml='\n'; for(var i=0;i"; let article = await getArticle(articles_all[i].id); if(null != article){ xml+="\n\t\t"+article.contentMD.replaceAll('<','<').replaceAll('>','>').replaceAll('&','&')+"" } xml+="\n\t\thttps://"+OPT.siteDomain+"/article/"+articles_all[i].id+"/"+articles_all[i].link+".html", xml+="\n\t\t", xml+="\n\t"; } xml+="\n" } return new Response(xml,{ headers:{ "content-type":"text/xml;charset=UTF-8" }, status:200 }); } //渲染前端博客:指定一级路径page\tags\category,二级路径value,以及页码,默认第一页 async function renderBlog(url){ console.log("---进入renderBlog函数---,path=", url.href.substr(url.origin.length)) //处理主题预览及分页 let theme=url.searchParams.get("theme"), pageSize=url.searchParams.get("pageSize"); if(theme){ OPT.themeURL=OPT.theme_github_path+theme+"/"; } if(pageSize){ OPT.pageSize=parseInt(pageSize); } //如果采用默认default主题,则改为加载default2.0主题 if(OPT.theme_github_path+"default/"==OPT.themeURL){ OPT.themeURL=OPT.theme_github_path+"default2.0/"; } console.log("theme pageSize",OPT.pageSize,OPT.themeURL) //获取主页模板源码 let theme_html=await getThemeHtml("index"), //KV中读取导航栏、分类目录、标签、链接、所有文章、近期文章等配置信息 menus=await getWidgetMenu(), categories=await getWidgetCategory(), tags=await getWidgetTags(), links=await getWidgetLink(), articles_all=await getArticlesList(), articles_recently=await getRecentlyArticles(articles_all); /** 前台博客 * 路径格式: * 域名/ 文章列表首页,等价于域名/page/1 * 域名/page/xxx 文章列表翻页 * * 域名/category/xxx 分类页,等价于域名/category/xxx/page/1 * 域名/category/xxx/page/xxx 分类页+翻页 * * 域名/tags/xxx 标签页,等价于域名/tags/xxx/page/1 * 域名/tags/xxx/page/xxx 分类页+翻页 * */ let paths = url.pathname.trim("/").split("/") let articles=[], pageNo=1 //获取文章列表 switch(paths[0]||"page"){ case "page": articles = articles_all pageNo = paths[1]||1 break; case "tags": case "category": let category_tag = paths.slice(1).join("");//如果无分页,tags、category后面都是标签、分类名 if(paths.length>3 && paths.includes("page")){ pageNo = paths[paths.indexOf("page")+1] //分页的页码 category_tag = paths.slice(1, paths.lastIndexOf("page")-1).join("") //tags、category后,分页前的为标签、分类名 } category_tag = decodeURIComponent(category_tag) articles = articles_all.filter(a => a[paths[0]].includes(category_tag)) break; } pageNo = parseInt(pageNo) // console.log(pageNo) // console.log(articles) //获取当页要显示文章列表 let articles_show = articles.slice((pageNo-1)*OPT.pageSize,pageNo*OPT.pageSize); // console.log(articles_show) //处理文章属性(年月日、url等) processArticleProp(articles_show); // console.log(url.pathname) let url_prefix = url.pathname.replace(/(.*)\/page\/\d+/,'$1/') if(url_prefix.substr(-1)=='/'){ url_prefix=url_prefix.substr(0,url_prefix.length-1); } // console.log(url_prefix) //组装各种参数 let newer=[{title:"上一页",url:url_prefix+"/page/"+(pageNo-1)}]; if(1==pageNo){ newer=[]; } let older=[{title:"下一页",url:url_prefix+"/page/"+(pageNo+1)}]; if(pageNo*OPT.pageSize>=articles.length){ older=[]; } // console.log(newer) // console.log(older) //文章标题、关键字 let title=(pageNo>1 ? "page "+pageNo+" - " : "")+OPT.siteName, keyWord=OPT.keyWords, cfg={}; cfg.widgetMenuList=menus,//导航 cfg.widgetCategoryList=categories,//分类目录 cfg.widgetTagsList=tags,//标签 cfg.widgetLinkList=links,//链接 cfg.widgetRecentlyList=articles_recently,//近期文章 cfg.articleList=articles_show,//当前页文章列表 cfg.pageNewer=newer,//上翻页链接 cfg.pageOlder=older,//下翻页链接 cfg.title=title,//网页title cfg.keyWords=keyWord;//SEO关键字 //使用mustache.js进行页面渲染(参数替换) cfg.OPT=OPT let html = Mustache.render(theme_html,cfg) return new Response(html,{ headers:{ "content-type":"text/html;charset=UTF-8" }, status:200 }) } //渲染前端博客的文章内容页 async function handle_article(id){ //获取内容页模板源码 let theme_html=await getThemeHtml("article"), //KV中读取导航栏、分类目录、标签、链接、近期文章等配置信息 menus=await getWidgetMenu(), categories=await getWidgetCategory(), tags=await getWidgetTags(), links=await getWidgetLink(), articles_recently=await getRecentlyArticles(); //获取上篇、本篇、下篇文章 let articles_sibling=await getSiblingArticle(id); //处理文章属性(年月日、url等) processArticleProp(articles_sibling); //获取本篇文章 let article=articles_sibling[1]; //组装文章详情页各参数 let title=article.title.replace(nullToEmpty(OPT.top_flag),'').replace(nullToEmpty(OPT.hidden_flag),'')+" - "+OPT.siteName, keyWord=article.tags.concat(article.category).join(","), cfg={}; cfg.widgetMenuList=menus,//导航 cfg.widgetCategoryList=categories,//分类目录 cfg.widgetTagsList=tags,//标签 cfg.widgetLinkList=links,//链接 cfg.widgetRecentlyList=articles_recently,//近期文章 cfg.articleOlder=articles_sibling[0]?[articles_sibling[0]]:[],//上篇文章 cfg.articleSingle=article,//本篇文章 cfg.articleNewer=articles_sibling[2]?[articles_sibling[2]]:[],//下篇文章 cfg.title=title,//网页title cfg.keyWords=keyWord;//SEO关键字 //使用mustache.js渲染页面(参数替换) cfg.OPT=OPT let html = Mustache.render(theme_html,cfg) //以html格式返回 return new Response(html,{ headers:{ "content-type":"text/html;charset=UTF-8" }, status:200 }) } //后台请求处理 async function handle_admin(request){ let url = new URL(request.url), paths = url.pathname.trim("/").split("/"), html,//返回html json,//返回json file;//返回文件 //新建页 if(1==paths.length||"list"==paths[1]){ //读取主题的admin/index.html源码 let theme_html=await getThemeHtml("admin/index"), //KV中读取导航栏、分类目录、链接、近期文章等配置信息 categoryJson=await getWidgetCategory(), menuJson=await getWidgetMenu(), linkJson=await getWidgetLink(); //手动替换格式的参数 html = theme_html.replaceHtmlPara("categoryJson",JSON.stringify(categoryJson)) .replaceHtmlPara("menuJson",JSON.stringify(menuJson)) .replaceHtmlPara("linkJson",JSON.stringify(linkJson)) //添加后台首页配置 if(OPT.admin_home_idx && OPT.admin_home_idx>=1 && OPT.admin_home_idx<=4){ html = html.replace("$('#myTab li:eq(0) 1').tab('show')","$($('#myTab a[href*=\"'+location.hash+'\"]')[0]||$('#myTab a:eq("+OPT.admin_home_idx+")')).tab('show')") } //添加置顶样式 if(OPT.top_flag_style){ html += OPT.top_flag_style } //添加隐藏样式 if(OPT.hidden_flag_style){ html += OPT.hidden_flag_style } } //发布 if("publish"==paths[1]){ //KV中获取文章列表 let articles_all=await getAllArticlesList(), tags=[]; //操作标签 //遍历所有文章,汇集所有的tag for(var i=0;i0 && -1==tags.indexOf(articles_all[i].tags[j])){ tags.push(articles_all[i].tags[j]); } } } } console.log(articles_all) //将所有标签一次性写入到KV中,并清除缓存 await saveWidgetTags(JSON.stringify(tags)) json = await purge()?'{"msg":"published ,purge Cache true","rst":true}':'{"msg":"published ,buuuuuuuuuuuut purge Cache false !!!!!!","rst":true}' } //文章列表 if("getList"==paths[1]){ //默认取第一页,每页20篇 let pageNo=(undefined===paths[2]) ? 1 : parseInt(paths[2]), list=await admin_nextPage(pageNo, 20);//每次加载20个 json = JSON.stringify(list) } //修改文章 if("edit"==paths[1]){ let id=paths[2], //获取主题admin/edit源码 theme_html=await getThemeHtml("admin/edit"), //KV中读取分类 categoryJson=JSON.stringify(await getWidgetCategory()), //KV中读取文章内容 articleJson=JSON.stringify(await getArticle(id)); //手动替换格式的参数 html = theme_html.replaceHtmlPara("categoryJson",categoryJson).replaceHtmlPara("articleJson",articleJson.replaceAll("script>","script>")) } //保存配置 if("saveConfig"==paths[1]){ const ret=await parseReq(request); let widgetCategory=ret.WidgetCategory,//分类 widgetMenu=ret.WidgetMenu,//导航 widgetLink=ret.WidgetLink;//链接 //判断格式,写入分类、导航、链接到KV中 if(checkFormat(widgetCategory) && checkFormat(widgetMenu) && checkFormat(widgetLink)){ let success = await saveWidgetCategory(widgetCategory) success = success && await saveWidgetMenu(widgetMenu) success = success && await saveWidgetLink(widgetLink) json = success ? '{"msg":"saved","rst":true}' : '{"msg":"Save Faild!!!","ret":false}' }else{ json = '{"msg":"Not a JSON object","rst":false}' } } //导入 if("import"==paths[1]){ let importJsone=(await parseReq(request)).importJson; console.log("开始导入",typeof importJson) if(checkFormat(importJson)){ let importJson=JSON.parse(importJson), keys=Object.keys(importJson); for(let i=0;i"; let article = await getArticle(articles_all[i].id); if(null != article){ xml+="\n\t\t"+article.contentMD.replaceAll('<','<').replaceAll('>','>').replaceAll('&','&')+"" } xml+="\n\t\thttps://"+OPT.siteDomain+"/article/"+articles_all[i].id+"/"+articles_all[i].link+".html", xml+="\n\t\t", xml+="\n\t"; } xml+="\n" file = { name: "search.xml", content: xml } } //导出sitemap.xml if("sitemap.xml"===paths[1]){ console.log("开始导出"); //读取文章列表,并按照特定的xml格式进行组装 let articles_all=await getArticlesList() let xml='\n'; for(var i=0;i", xml+="\n\t\t"+articles_all[i].createDate.substr(0,10)+"", xml+="\n\t\t"+(void 0===articles_all[i].changefreq?"daily":articles_all[i].changefreq)+"", xml+="\n\t\t"+(void 0===articles_all[i].priority?"0.5":articles_all[i].priority)+"", xml+="\n\t"; } xml+="\n" file = { name: "sitemap.xml", content: xml } } //新建文章 if("saveAddNew"==paths[1]){ const ret=await parseReq(request); let title=ret.title,//文章标题 img=ret.img,//插图 link=ret.link,//永久链接 createDate=ret.createDate.replace('T',' '),//发布日期 category=ret.category,//分类 tags=ret.tags,//标签 priority=void 0===ret.priority?"0.5":ret.priority,//权重 changefreq=void 0===ret.changefreq?"daily":ret.changefreq,//更新频率 contentMD=ret["content-markdown-doc"],//文章内容-md格式 contentHtml=ret["content-html-code"],//文章内容-html格式 contentText="",//文章摘要 top_timestamp=ret.top_timestamp*1,//置顶时间戳,不置顶时为0 modify_timestamp=new Date().getTime()+8*60*60*1000,//修改时间戳 hidden=ret.hidden*1,//是否隐藏 id="";//文章id //校验参数完整性 if(title.length>0 && createDate.length>0 && category.length>0 && contentMD.length>0 && contentHtml.length>0){ id=await generateId(), contentText=contentHtml.replace(/<\/?[^>]*>/g,"").trim().substring(0,OPT.readMoreLength);//摘要 //组装文章json let article={ id:id, title:title, img:img, link:link, createDate:createDate, category:category, tags:tags, contentMD:contentMD, contentHtml:contentHtml, contentText:contentText, priority:priority, top_timestamp:top_timestamp, modify_timestamp:modify_timestamp, hidden:hidden, changefreq:changefreq }; //将文章json写入KV(key为文章id,value为文章json字符串) await saveArticle(id,JSON.stringify(article)); //组装文章json let articleWithoutHtml={ id:id, title:title, img:img, link:link, createDate:createDate, category:category, tags:tags, contentText:contentText, priority:priority, top_timestamp:top_timestamp, modify_timestamp:modify_timestamp, hidden:hidden, changefreq:changefreq }, articles_all_old=await getAllArticlesList(),//读取文章列表 articles_all=[]; //将最新的文章写入文章列表中,并按id排序后,再次回写到KV中 articles_all.push(articleWithoutHtml), articles_all=articles_all.concat(articles_all_old), articles_all=sortArticle(articles_all), await saveArticlesList(JSON.stringify(articles_all)) json = '{"msg":"added OK","rst":true,"id":"'+id+'"}' }else{ json = '{"msg":"信息不全","rst":false}' } } //删除 if("delete"==paths[1]){ let id=paths[2] if(6==id.length){ await CFBLOG.delete(id); let e=await getAllArticlesList(); for(r=0;r