一文学会使用Remix写API接口

 更新时间:2023年04月10日 14:21:42   作者:乔治_x  
这篇文章主要为大家介绍了一文学会Remix写API接口实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

本文提要

Remix 是一个全栈框架,能写 api 接口的能肯定是具备的,而且 Remix 虽然定义为全栈框架,此文章主要探索如何接口。

  • Remix 中 api 的书写方式
  • Remix 中 RESTful api 的属性方式
  • 类 MVC 分层接口如何写 Remix
  • 处理上传示例

接口种类

  • 普通 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 请求

export const loader = () => {
  return json({ get: 'loader get' })
}

action 处理非 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()
}

暴露 loader 接口

// 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 函数返回数据。

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

  • 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接口的资料请关注脚本之家其它相关文章!

相关文章

  • React 实现拖拽功能的示例代码

    React 实现拖拽功能的示例代码

    这篇文章主要介绍了React 实现拖拽功能的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • React基于RBAC的权限控制案例讲解

    React基于RBAC的权限控制案例讲解

    这篇文章主要介绍了React基于RBAC的权限控制,通过定义角色和权限、编写权限检查函数以及在路由、组件和选择控件中使用这些函数,可以灵活地控制应用中的访问权限,需要的朋友可以参考下
    2024-05-05
  • react.js框架Redux基础案例详解

    react.js框架Redux基础案例详解

    这篇文章主要介绍了react.js框架Redux基础案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • React实现基于Antd密码强度校验组件示例详解

    React实现基于Antd密码强度校验组件示例详解

    这篇文章主要为大家介绍了React实现基于Antd密码强度校验组件示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • React实现一个高度自适应的虚拟列表

    React实现一个高度自适应的虚拟列表

    这篇文章主要介绍了React如何实现一个高度自适应的虚拟列表,帮助大家更好的理解和学习使用React,感兴趣的朋友可以了解下
    2021-04-04
  • React SSR架构Streaming Render与Selective Hydration解析

    React SSR架构Streaming Render与Selective Hydration解析

    这篇文章主要为大家介绍了React SSR架构Streaming Render与Selective Hydration解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-03-03
  • 详解React开发中使用require.ensure()按需加载ES6组件

    详解React开发中使用require.ensure()按需加载ES6组件

    本篇文章主要介绍了详解React开发中使用require.ensure()按需加载ES6组件,非常具有实用价值,需要的朋友可以参考下
    2017-05-05
  • React注册倒计时功能的实现

    React注册倒计时功能的实现

    这篇文章主要介绍了React注册倒计时功能的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • 在 React 中使用 Context API 实现跨组件通信的方法

    在 React 中使用 Context API 实现跨组件通信的方法

    在React中,ContextAPI是一个很有用的特性,可用于组件间的状态共享,它允许跨组件传递数据而无需通过每个组件手动传递props,本文给大家介绍在 React 中如何使用 Context API 来实现跨组件的通信,感兴趣的朋友一起看看吧
    2024-09-09
  • Remix如何支持原生 CSS方法详解

    Remix如何支持原生 CSS方法详解

    这篇文章主要为大家介绍了Remix如何支持原生CSS的方法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-05-05

最新评论