V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  hamsterbase  ›  全部回复第 8 页 / 共 18 页
回复总数  349
1 ... 4  5  6  7  8  9  10  11  12  13 ... 18  
6. 他没把文件写到本地,所以改一下 prompt

Q:

我希望你能帮我编写一下服务端的代码。

需要有以下四个接口接口为

1. 获取文件夹列表

2. 根据文件夹名字,文件名获取文件内容

3. 根据文件夹名字,文件名删除文件

4. 根据文件夹名字,文件名删除文件

要求。

1. 基于 koa 编写
2. 使用 typescript 编写
3. 文件名,文件名必须为 64 个字符,每个字符是 0-9 和 A-F 之间的一个 16 进制数字
4. 文件夹名和文件名,文件内容都通过 body 传递。
5. 我希望你能用 koa-router 编写
6. 文件希望写入到本地的 data 文件夹下
7. API 必须以 public/api/v1 开头

Q:

```ts
import Koa from "koa";
import Router from "koa-router";
import fs from "fs/promises";
import path from "path";

const app = new Koa();
const router = new Router();

const DATA_FOLDER = "data";

// 获取文件夹列表
router.get("/public/api/v1/folders", async (ctx) => {
try {
const folders = await fs.readdir(DATA_FOLDER);
ctx.body = folders;
} catch (err) {
ctx.status = 500;
ctx.body = "Internal Server Error";
console.error(err);
}
});

// 根据文件夹名字,文件名获取文件内容
router.get(
"/public/api/v1/folders/:folderName/files/:fileName",
async (ctx) => {
const { folderName, fileName } = ctx.params;
const filePath = path.join(DATA_FOLDER, folderName, fileName);
try {
const fileContent = await fs.readFile(filePath, "utf-8");
ctx.body = fileContent;
} catch (err) {
if (err.code === "ENOENT") {
ctx.status = 404;
ctx.body = "File Not Found";
} else {
ctx.status = 500;
ctx.body = "Internal Server Error";
console.error(err);
}
}
}
);

// 根据文件夹名字,文件名删除文件
router.del(
"/public/api/v1/folders/:folderName/files/:fileName",
async (ctx) => {
const { folderName, fileName } = ctx.params;
const filePath = path.join(DATA_FOLDER, folderName, fileName);
try {
await fs.unlink(filePath);
ctx.body = "File Deleted";
} catch (err) {
if (err.code === "ENOENT") {
ctx.status = 404;
ctx.body = "File Not Found";
} else {
ctx.status = 500;
ctx.body = "Internal Server Error";
console.error(err);
}
}
}
);

// 根据文件夹名字,文件名删除文件
router.post(
"/public/api/v1/folders/:folderName/files/:fileName",
async (ctx) => {
const { folderName, fileName } = ctx.params;
const filePath = path.join(DATA_FOLDER, folderName, fileName);
try {
await fs.mkdir(path.join(DATA_FOLDER, folderName), { recursive: true });
await fs.writeFile(filePath, ctx.request.body);
ctx.body = "File Created";
} catch (err) {
ctx.status = 500;
ctx.body = "Internal Server Error";
console.error(err);
}
}
);

app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000, () => {
console.log("Server listening on port 3000");
});
```

接口说明:

获取文件夹列表:GET /public/api/v1/folders
根据文件夹名字,文件名获取文件内容:GET /public/api/v1/folders/:folderName/files/:fileName
根据文件夹名字,文件名删除文件:DELETE /public/api/v1/folders/:folderName/files/:fileName
根据文件夹名字,文件名删除文件:POST /public/api/v1/folders/:folderName/files/:fileName
其中,文件名和文件夹名都是 64 个字符的 16 进制数字字符串。文件内容通过 Request Body 传递,文件保存在本地的 data 文件夹下。如果出现错误,会返回适当的 HTTP 状态码和错误信息。
@aitianci 基于 crdt ,不会丢数据的
@x308989414q

暂时不支持,未来会支持。
@DemonQ 请问你是用 1.2 版本吗?

填完 token 以后,刷新页面试试看?
@ggmood 同步指的是什么意思?数
用的是 notion api ,数据都在 notion
@jaredyam release 不能合并其他的 release 分支。


只有 master -初始化-> release 和 release -发布-> master

如果公共代码,可以分别 PR 到 release A 和 release B
1. master 为基线,只包含上次发布的代码
2. release/a.b.c 为迭代分支,迭代分支只包含当前代码。
3. 每个迭代可以单独的部署,提测前需要合并最新的 master 基线。
4. 平时开发流程为 创建分支,往迭代合并。 不允许直接合并 master
5. 迭代发布后打 tag, va.b.c 。
2023-06-03 11:28:50 +08:00
回复了 rivercherdeeeeee 创建的主题 程序员 emby 服务的问题
安装 tailscale 就行了。emby 服务器和手机都安装 tailscale
2023-05-24 01:51:06 +08:00
回复了 jpkrhan 创建的主题 程序员 请教剪藏网页有什么好用的软件?
提几个建议

1. 建议笔记和剪藏分离,剪藏太多会污染自己写的笔记。
2. 建议保存快照,而不是保存文章。 快照可以用阅读模式提取出文章内容,而文章无法恢复到快照。


喜欢在线服务,可以用 evernote ,cubox ,readwise 。
喜欢离线部署,可以看看 hamsterbase
2023-05-21 19:24:14 +08:00
回复了 lawcc 创建的主题 问与答 请问如何保存网上看到的好帖子、文章等?
@shakespark

是的,目前的核心功能是管理用户上传的 html 。 未来会扩展到 rss 和 电子书。


用户现在可以手动上传,也可以用 singlefile 插件直接保存。

和其他从服务器保存的软件不同,我们可管保存内网,需要登录的网页。 再保存之前可去广告。
@TToo 能详细说说嘛
@TToo 目前只能自己写脚本批量解压 objects 下的文件。
2023-05-19 17:07:48 +08:00
回复了 dada88xyxy 创建的主题 程序员 请教一下大伙是怎么样保存互联网文章?
@pendulum 这个不是 hamsterbase 的职责。

如果要暴露到公网,可以在外面套 nginx

如果是想随时访问,可以用 tailscale
2023-05-19 08:38:39 +08:00
回复了 dada88xyxy 创建的主题 程序员 请教一下大伙是怎么样保存互联网文章?
@dada88xyxy


常见的网页归档格式有 MHTML 和 webarchive 。这两种格式都可以将网页的全部图片、样式和 HTML 保存为一个文件。

操作系统其实自带了保存网页归档的功能:

安卓 Chrome:点击收藏旁边的下载按钮,保存格式为 MHTML 。
iOS Safari:点击分享 > 点击选项 > 点击网页归档 > 点击储存到文件,保存格式为 webarchive 。
Mac Safari:可以按 Ctrl + S 选择网页归档,保存格式为 webarchive 。
PC Chrome:可以按 Ctrl + S 选择单文件,保存格式为 MHTML 。

你也可以使用 SingleFile 插件,将网页保存为单个 HTML 文件。

这些方式可以很好地实现网页的保存和查看。但很难实现网页的检索、管理以及进一步的批注和消化。

为了更好地管理我之前保存的几千个 html 文件,我开发了 HamsterBase 。它支持解析 HTML 、webarchive 和 MHTML 。导入后支持批注、全文搜索。


hamsterbase 支持自动导入,放到文件夹下可以自动导入。
也提供了 API , 可以直接和 singilefile 联动,singilefile 可以一键保存网页到 hamsterbase 。

⚠️:hamsterbase 不会修改任何用户导入的文件, 只会压缩后储存。
⚠️:hamsterbase 不存储任何用户数据,所有数据都在你的本地。
2023-05-18 21:46:59 +08:00
回复了 robbaa 创建的主题 程序员 找不到好用又便宜的笔记软件,又想造轮子了
不建议从头造轮子, 可以基于开源项目改。

目前我觉得 logseq 不错。
2023-05-18 21:28:13 +08:00
回复了 blackboxo 创建的主题 程序员 Github 开源接收赞赏的国内方式还有吗?顿顿饭关掉了
@blackboxo 自己重新画一个二维码? 带上漂亮的 logo

不知道这样能不能扫
2023-05-18 21:23:19 +08:00
回复了 blackboxo 创建的主题 程序员 Github 开源接收赞赏的国内方式还有吗?顿顿饭关掉了
入口深一层,流量少 9 成。
还是推荐收款码,或者要选那种不需要登录注册的平台。越方便越好。
1 ... 4  5  6  7  8  9  10  11  12  13 ... 18  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2578 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 24ms · UTC 15:29 · PVG 23:29 · LAX 07:29 · JFK 10:29
Developed with CodeLauncher
♥ Do have faith in what you're doing.