目录本文提要接口种类RESTful api 特点Remix 中如何处理 api 特点Loader 函数处理 Get 请求action 处理非 GET 方法添加控制层和服务层暴露 lo
Remix 是一个全栈框架,能写 api 接口的能肯定是具备的,而且 Remix 虽然定义为全栈框架,此文章主要探索如何接口。
其中如果是一些小项目,没有必要规则化的项目,使用 get/post 处理就已经足够了,如果项目有了很多的人要维护,并且有了一定的规模,为了方便管理,可以使用 RESTful API 的方式处理。graphql API 手动能力最强。
其中,:id 表示资源的唯一标识符。
export const loader = () => {
return JSON({ get: 'loader get' })
}
import { json } from "@remix-run/node";
const handleNotGetRequest = function ({ request }) {
const method = request.method;
switch (method) {
case "POST":
return json({ code: 0, method: "POST", message: "添加成功" });
case "PUT":
return json({ ok: true, code: 1, method: "PUT", message: "修改成功" });
case "DELETE":
return json({ ok: true, code: 1, method: "PUT", message: "删除成功" });
default:
break;
}
};
// 非 get
export const action = ({ request }) => {
return handleNotGetRequest({ request });
};
// get
export const loader = ({ request }) => {
return json({
a: 1,
});
};
为了代码更加好维护,有结构的代码时必要的,代码分层占据重要位置。
如果使用 monGoose
等会定义模型层,定义操作数据的模型,然后使用控制层来操作模型层。构成一个简单类 MVC 分层结构。当然 Remix 是一个基于 React + node.js 全栈框架,使用模型层+服务层:
使用 mongoose 定义模型层, category.model.ts
import mongoose from 'mongoose'
const CategorySchema = new mongoose.Schema({
name: String,
description: String,
createdAt: Date,
articleIds: [String]
})
export default mongoose.models.Category ||
mongoose.model('Category', CategorySchema)
使用 category.service.ts
定义服务层,提供给 Remix loader 和 action 操作数据使用
// model
import Category from '~/models/category.model'
export const delCategoryById = async (_id: string) => {
return await Category.remove({ _id })
}
export const findCategoryByName = async (name: string) => {
return await Category.findOne({ name })
}
export const updateCategoryById = async (_id: string, update: any) => {
return await Category.findByIdAndUpdate({ _id }, update)
}
export const findCategoryById = async (_id: string) => {
return await Category.findOne({ _id })
}
export const addCategoryByName = async (name: string) => {
const CategoryEntify = new Category({ name, createdAt: new Date() })
return await CategoryEntify.save()
}
// core
import { json } from '@remix-run/node'
// service
import * as categoryService from '~/services/category.service'
// remix loader
export async function loader() {
const list = await categoryService
.getCategoryList({}, '_id createdAt name articleIds', 0, 100000)
.then((list) => list)
return json({ code: 0, message: 'success', data: { list } }, 200)
}
在 loader 函数中通过 services 层来获取数据,然后使用 json 函数返回数据。
api.upload.files.tsx
上传文件到本地import type { ActionArgs } from '@remix-run/node'
import {
json,
unstable_composeUploadHandlers as composeUploadHandlers,
unstable_createFileUploadHandler as createFileUploadHandler,
unstable_createMemoryUploadHandler as createMemoryUploadHandler,
unstable_parseMultipartFORMData as parseMultipartFormData
} from '@remix-run/node'
// single file upload
export const action = async ({ request }: ActionArgs) => {
const uploadHandler = composeUploadHandlers(
createFileUploadHandler({
directory: 'public/uploads', // 指定上传目录
maxPartSize: 30000000, // 指定大小
file: (file) => {
return file.filename
}
}),
createMemoryUploadHandler()
)
const formData = await parseMultipartFormData(request, uploadHandler)
return json({ imgSrc: formData.get('file') }) // 返回文件名
}
上传使用 post 方法,在 action 函数使用表单方式进行处理。
本文主要关注点是与 Node.js 其他的框架有什么不同。loader 处理 get 方法,action 处理非 get 请求。从普通的请求处理到处理分层的过程,写好一个 api 的学习变化过程。
更多关于Remix API接口的资料请关注编程网其它相关文章!
--结束END--
本文标题: 一文学会使用Remix写API接口
本文链接: https://lsjlt.com/news/208549.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-01-12
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
2023-05-20
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0