乐趣区

关于react.js: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 的学习变动过程。

退出移动版