最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文學會使用Remix寫API接口

 更新時間:2023年04月10日 14:21:42   作者:喬治_x  
這篇文章主要為大家介紹了一文學會Remix寫API接口實現示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

本文提要

Remix 是一個全??蚣?,能寫 api 接口的能肯定是具備的,而且 Remix 雖然定義為全??蚣埽宋恼轮饕剿魅绾谓涌凇?/p>

  • Remix 中 api 的書寫方式
  • Remix 中 RESTful api 的屬性方式
  • 類 MVC 分層接口如何寫 Remix
  • 處理上傳示例

接口種類

  • 普通 get/post api:即可滿足基本
  • RESTful API:有規(guī)范, 需要協同的
  • graphql:可控制需要的字段的,良好的跨端

其中如果是一些小項目,沒有必要規(guī)則化的項目,使用 get/post 處理就已經足夠了,如果項目有了很多的人要維護,并且有了一定的規(guī)模,為了方便管理,可以使用 RESTful API 的方式處理。graphql API 手動能力最強。

RESTful API 特點

  • 創(chuàng)建:POST /api/resources
  • 讀?。篏ET /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中的useEffect四種用法分享

    React中的useEffect四種用法分享

    這篇文章主要給大家分享React中的useEffect四種用法,useEffect中 觸發(fā)更新,重復的 useEffect,依賴值觸發(fā)回調,useEffect 的返回值,通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-07-07
  • react組件中的constructor和super知識點整理

    react組件中的constructor和super知識點整理

    這篇文章主要介紹了react組件中的constructor和super知識點整理,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-08-08
  • React組件間通信的三種方法(簡單易用)

    React組件間通信的三種方法(簡單易用)

    React知識中一個主要內容便是組件之間的通信,以下列舉幾種常用的組件通信方式,本文就詳細的介紹一下,感興趣的可以了解一下
    2021-10-10
  • 詳解React Native頂|底部導航使用小技巧

    詳解React Native頂|底部導航使用小技巧

    本篇文章主要介紹了詳解React Native頂|底部導航使用小技巧 ,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • React組件化條件渲染的實現

    React組件化條件渲染的實現

    本文主要介紹了React組件化條件渲染的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • react中監(jiān)聽props的改變方式

    react中監(jiān)聽props的改變方式

    這篇文章主要介紹了react中監(jiān)聽props的改變方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Objects are not valid as a React child報錯解決

    Objects are not valid as a Rea

    這篇文章主要為大家介紹了Objects are not valid as a React child報錯解決方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-12-12
  • React Native全面屏狀態(tài)欄和底部導航欄適配教程詳細講解

    React Native全面屏狀態(tài)欄和底部導航欄適配教程詳細講解

    最近在寫 React Native 項目,調試應用時發(fā)現頂部狀態(tài)欄和底部全面屏手勢指示條區(qū)域不是透明的,看起來很難受。研究了一下這個問題,現在總結一下解決方案,這篇文章主要介紹了React Native全面屏狀態(tài)欄和底部導航欄適配教程
    2023-01-01
  • react 應用多入口配置及實踐總結

    react 應用多入口配置及實踐總結

    這篇文章主要介紹了react 應用多入口配置及實踐總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-10-10
  • react實現消息顯示器

    react實現消息顯示器

    這篇文章主要為大家詳細介紹了react實現消息顯示器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

视频| 安丘市| 澄迈县| 洛隆县| 茂名市| 尚志市| 西藏| 绥化市| 内黄县| 应用必备| 东乌珠穆沁旗| 迭部县| 河北区| 翁牛特旗| 承德县| 临澧县| 家居| 久治县| 定州市| 铜山县| 安陆市| 汤原县| 龙里县| 大城县| 武平县| 南平市| 怀远县| 商洛市| 成安县| 正安县| 温泉县| 达孜县| 休宁县| 新竹县| 金秀| 临漳县| 石河子市| 南和县| 康定县| 苏尼特左旗| 呼图壁县|