怎么使用Remix写API接口

其他教程   发布日期:2025年01月03日   浏览次数:223

这篇文章主要介绍“怎么使用Remix写API接口”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“怎么使用Remix写API接口”文章能帮助大家解决问题。

接口种类

  • 普通 get/post api:即可满足基本

  • RESTful API:有规范, 需要协同的

  • graphql:可控制需要的字段的,良好的跨端

其中如果是一些小项目,没有必要规则化的项目,使用 get/post 处理就已经足够了,如果项目有了很多的人要维护,并且有了一定的规模,为了方便管理,可以使用 RESTful API 的方式处理。graphql API 手动能力最强。

RESTful API 特点

  • 创建:POST /api/resources

  • 读取:GET /api/resources/:id

  • 更新:PUT /api/resources/:id

  • 删除:DELETE /api/resources/:id

其中,:id 表示资源的唯一标识符。

Remix 中如何处理 api 特点

  • loader 处理 get 请求

  • action 处理非 get 请求

Loader 函数处理 Get 请求

  1. export const loader = () => {
  2. return json({ get: 'loader get' })
  3. }

action 处理非 GET 方法

  1. import { json } from "@remix-run/node";
  2. const handleNotGetRequest = function ({ request }) {
  3. const method = request.method;
  4. switch (method) {
  5. case "POST":
  6. return json({ code: 0, method: "POST", message: "添加成功" });
  7. case "PUT":
  8. return json({ ok: true, code: 1, method: "PUT", message: "修改成功" });
  9. case "DELETE":
  10. return json({ ok: true, code: 1, method: "PUT", message: "删除成功" });
  11. default:
  12. break;
  13. }
  14. };
  15. // 非 get
  16. export const action = ({ request }) => {
  17. return handleNotGetRequest({ request });
  18. };
  19. // get
  20. export const loader = ({ request }) => {
  21. return json({
  22. a: 1,
  23. });
  24. };

添加控制层和服务层

为了代码更加好维护,有结构的代码时必要的,代码分层占据重要位置。

如果使用

  1. mongoose
等会定义模型层,定义操作数据的模型,然后使用控制层来操作模型层。构成一个简单类 MVC 分层结构。当然 Remix 是一个基于 React + Node.js 全栈框架,使用模型层+服务层:

使用 mongoose 定义模型层,

  1. category.model.ts
  1. import mongoose from 'mongoose'
  2. const CategorySchema = new mongoose.Schema({
  3. name: String,
  4. description: String,
  5. createdAt: Date,
  6. articleIds: [String]
  7. })
  8. export default mongoose.models.Category ||
  9. mongoose.model('Category', CategorySchema)

使用

  1. category.service.ts
定义服务层,提供给 Remix loader 和 action 操作数据使用
  1. // model
  2. import Category from '~/models/category.model'
  3. export const delCategoryById = async (_id: string) => {
  4. return await Category.remove({ _id })
  5. }
  6. export const findCategoryByName = async (name: string) => {
  7. return await Category.findOne({ name })
  8. }
  9. export const updateCategoryById = async (_id: string, update: any) => {
  10. return await Category.findByIdAndUpdate({ _id }, update)
  11. }
  12. export const findCategoryById = async (_id: string) => {
  13. return await Category.findOne({ _id })
  14. }
  15. export const addCategoryByName = async (name: string) => {
  16. const CategoryEntify = new Category({ name, createdAt: new Date() })
  17. return await CategoryEntify.save()
  18. }

暴露 loader 接口

  1. // core
  2. import { json } from '@remix-run/node'
  3. // service
  4. import * as categoryService from '~/services/category.service'
  5. // remix loader
  6. export async function loader() {
  7. const list = await categoryService
  8. .getCategoryList({}, '_id createdAt name articleIds', 0, 100000)
  9. .then((list) => list)
  10. return json({ code: 0, message: 'success', data: { list } }, 200)
  11. }

在 loader 函数中通过 services 层来获取数据,然后使用 json 函数返回数据。

使用 action 方法处理文件上传接口

    1. api.upload.files.tsx
    上传文件到本地
  1. import type { ActionArgs } from '@remix-run/node'
  2. import {
  3. json,
  4. unstable_composeUploadHandlers as composeUploadHandlers,
  5. unstable_createFileUploadHandler as createFileUploadHandler,
  6. unstable_createMemoryUploadHandler as createMemoryUploadHandler,
  7. unstable_parseMultipartFormData as parseMultipartFormData
  8. } from '@remix-run/node'
  9. // single file upload
  10. export const action = async ({ request }: ActionArgs) => {
  11. const uploadHandler = composeUploadHandlers(
  12. createFileUploadHandler({
  13. directory: 'public/uploads', // 指定上传目录
  14. maxPartSize: 30000000, // 指定大小
  15. file: (file) => {
  16. return file.filename
  17. }
  18. }),
  19. createMemoryUploadHandler()
  20. )
  21. const formData = await parseMultipartFormData(request, uploadHandler)
  22. return json({ imgSrc: formData.get('file') }) // 返回文件名
  23. }

上传使用 post 方法,在 action 函数使用表单方式进行处理。

以上就是怎么使用Remix写API接口的详细内容,更多关于怎么使用Remix写API接口的资料请关注九品源码其它相关文章!