React 파일 관리자를 만들어 봅시다 21장: 서버에서 디렉토리 만들기
22684 단어 typescriptmongezjavascriptreact
// src/controllers/file-manager/createDirectory.ts
import { Request, Response } from "express";
/**
* Create a directory
*/
export default async function createDirectory(
request: Request,
response: Response
) {
//
}
이것이 디렉토리 생성에 대한 마지막 코드였습니다. 이제 요청에서 디렉토리 이름과 그 안에 해당 디렉토리를 생성할 경로를 가져와야 합니다.
// src/controllers/file-manager/createDirectory.ts
import fs from "@mongez/fs";
import makeNode from "app/utils/node";
import { dataPath } from "app/utils/paths";
import { Request, Response } from "express";
/**
* Create a directory
*/
export default async function createDirectory(
request: Request,
response: Response
) {
// Get the directory name that will be created, also get the path of the directory
const { name, path } = request.body;
// now validate the name and path
if (!name) {
return response.status(400).json({
error: "Directory name is required",
});
}
if (!path) {
return response.status(400).json({
error: "Directory path is required",
});
}
// check if the path is located in the directory path
const fullPath = dataPath(path);
// check if the directory exists
if (!fs.isDirectory(fullPath)) {
return response.status(400).json({
error: "The path is not a directory",
});
}
// check if the directory already exists
const directoryPath = path + "/" + name;
const directoryFullPath = dataPath(directoryPath);
if (fs.isDirectory(directoryFullPath)) {
return response.status(400).json({
error: "The directory already exists",
});
}
// now create the directory
fs.makeDirectory(directoryFullPath);
// return the directory as node
return response.json({
node: makeNode(directoryPath),
});
}
여기에서 우리가 한 것은 다섯 가지입니다.
여기서 언급하고 인정해야 할 또 다른 사항은 익스프레스 서버에 json 데이터를 수신할 것임을 알려야 하므로
src/index.ts
파일에 다음 코드를 추가해야 한다는 것입니다.// src/index.ts
...
// create express app
const app: Express = express();
// 👇🏻 tell express to receive json data
app.use(express.json());
이제 React 프로젝트에서 빠르게 시도하고 홈페이지를 열고 홈페이지 구성 요소 위에 다음 코드를 추가할 수 있습니다.
Don't forget to restart the backend server if you was running it while you're developing.
// HomePage.tsx
import endpoint from "@mongez/http";
endpoint.post("/file-manager/directory", {
path: "/",
name: "new-directory",
});
그런 다음 응답을 확인하십시오. 노드로서의 디렉토리여야 합니다.
디렉토리에 두 개의 슬래시
//new-directory
가 있는 것을 볼 수 있습니다. 이는 경로가 /
이고 다른 슬래시/
를 추가하여 두 개의 슬래시를 복제하기 때문입니다.이 문제를 관리하기 위해 작은 패키지를 설치해 보겠습니다.
yarn add @mongez/concat-route
이제 함수를 다시 업데이트해 보겠습니다.
// src/controllers/file-manager/createDirectory.ts
// 👇🏻 import the package
import concatRoute from "@mongez/concat-route";
import fs from "@mongez/fs";
import makeNode from "app/utils/node";
import { dataPath } from "app/utils/paths";
import { Request, Response } from "express";
/**
* Create a directory
*/
export default async function createDirectory(
request: Request,
response: Response
) {
// Get the directory name that will be created, also get the path of the directory
const { name, path } = request.body;
// now validate the name and path
if (!name) {
return response.status(400).json({
error: "Directory name is required",
});
}
if (!path) {
return response.status(400).json({
error: "Directory path is required",
});
}
// check if the path is located in the directory path
const fullPath = dataPath(path);
// check if the directory exists
if (!fs.isDirectory(fullPath)) {
return response.status(400).json({
error: "The path is not a directory",
});
}
// check if the directory already exists
// 👇🏻 use the package to concat the path and name instead of adding them manually
const directoryPath = concatRoute(path, name);
const directoryFullPath = dataPath(directoryPath);
if (fs.isDirectory(directoryFullPath)) {
return response.status(400).json({
error: "The directory already exists",
});
}
// now create the directory
fs.makeDirectory(directoryFullPath);
// return the directory as node
return response.json({
node: makeNode(directoryPath),
});
}
이제 서버를 다시 시작하고
new-directory-2
생성을 다시 시도합니다.훨씬 더 나은,
makeNode
기능에서 동일한 기능을 사용합시다.// src/utils/node.ts
// import the Node type from the client directory xD
import concatRoute from "@mongez/concat-route";
import { isDirectory, size } from "@mongez/fs";
import { Node } from "./../../../client/src/apps/front-office/file-manager/Kernel/Kernel.types";
import { dataPath } from "./paths";
export type { Node };
/**
* Generate a node object to the given path,
* the given path should be relative to the data directory
*/
export default function makeNode(path: string, children?: string[]): Node {
// get the full path of the node
const fullPath = dataPath(path);
const node: Node = {
path,
name: path.split("/")?.pop() || "/",
isDirectory: isDirectory(fullPath),
size: size(fullPath),
};
if (node.isDirectory) {
node.children = (children || []).map((child) =>
// 👇🏻 we need to check if the path is the root then we will just append it to the child
// if its not the root then we need to append `/` to the path and then append the child
// 👉🏻 the old one makeNode((path === "/" ? path : path + "/") + child)
// 👇🏻 more readable and cleaner
makeNode(concatRoute(path, child))
);
}
return node;
}
다음 장
다음 장에서는
createDirectory
작업의 반응 프로젝트에서 요청을 할 것입니다.기사 저장소
Github Repository에서 챕터 파일을 볼 수 있습니다.
Don't forget the
main
branch has the latest updated code.
지금 어디 있는지 말해줘
이 시리즈를 저와 함께 후속 조치하는 경우 현재 위치와 어려움을 겪고 있는 부분을 알려주시면 최대한 도와드리겠습니다.
살람.
Reference
이 문제에 관하여(React 파일 관리자를 만들어 봅시다 21장: 서버에서 디렉토리 만들기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hassanzohdy/lets-create-a-react-file-manager-chapter-xxi-create-directory-in-server-5ejm텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)