欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

一文學(xué)會(huì)使用Remix寫(xiě)API接口

 更新時(shí)間:2023年04月10日 14:21:42   作者:?jiǎn)讨蝊x  
這篇文章主要為大家介紹了一文學(xué)會(huì)Remix寫(xiě)API接口實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文提要

Remix 是一個(gè)全??蚣?,能寫(xiě) api 接口的能肯定是具備的,而且 Remix 雖然定義為全棧框架,此文章主要探索如何接口。

  • Remix 中 api 的書(shū)寫(xiě)方式
  • Remix 中 RESTful api 的屬性方式
  • 類(lèi) MVC 分層接口如何寫(xiě) Remix
  • 處理上傳示例

接口種類(lèi)

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

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

RESTful API 特點(diǎn)

  • 創(chuàng)建:POST /api/resources
  • 讀?。篏ET /api/resources/:id
  • 更新:PUT /api/resources/:id
  • 刪除:DELETE /api/resources/:id

其中,:id 表示資源的唯一標(biāo)識(shí)符。

Remix 中如何處理 api 特點(diǎn)

  • loader 處理 get 請(qǐng)求
  • action 處理非 get 請(qǐng)求

Loader 函數(shù)處理 Get 請(qǐng)求

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,
  });
};

添加控制層和服務(wù)層

為了代碼更加好維護(hù),有結(jié)構(gòu)的代碼時(shí)必要的,代碼分層占據(jù)重要位置。

如果使用 mongoose 等會(huì)定義模型層,定義操作數(shù)據(jù)的模型,然后使用控制層來(lái)操作模型層。構(gòu)成一個(gè)簡(jiǎn)單類(lèi) MVC 分層結(jié)構(gòu)。當(dāng)然 Remix 是一個(gè)基于 React + Node.js 全??蚣?,使用模型層+服務(wù)層:

使用 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 定義服務(wù)層,提供給 Remix loader 和 action 操作數(shù)據(jù)使用

// 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 函數(shù)中通過(guò) services 層來(lái)獲取數(shù)據(jù),然后使用 json 函數(shù)返回?cái)?shù)據(jù)。

使用 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 函數(shù)使用表單方式進(jìn)行處理。

小結(jié)

本文主要關(guān)注點(diǎn)是與 Node.js 其他的框架有什么不同。loader 處理 get 方法,action 處理非 get 請(qǐng)求。從普通的請(qǐng)求處理到處理分層的過(guò)程,寫(xiě)好一個(gè) api 的學(xué)習(xí)變化過(guò)程。

更多關(guān)于Remix API接口的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文詳解React組件API

    一文詳解React組件API

    這篇文章主要介紹了React的組件API,及組件API的用法詳解,文中有詳細(xì)的代碼示例,對(duì)學(xué)習(xí)或工作有一定的參考價(jià)值,感興趣的同學(xué)可以閱讀本文
    2023-04-04
  • react如何將字符串轉(zhuǎn)義成html語(yǔ)句

    react如何將字符串轉(zhuǎn)義成html語(yǔ)句

    這篇文章主要介紹了react如何將字符串轉(zhuǎn)義成html語(yǔ)句問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用詳解

    React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用詳解

    這篇文章主要介紹了React router動(dòng)態(tài)加載組件之適配器模式的應(yīng)用 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2018-09-09
  • Ant Design組件庫(kù)的使用教程

    Ant Design組件庫(kù)的使用教程

    AntDesign ,簡(jiǎn)稱(chēng)antd是基于 Ant Design 設(shè)計(jì)體系的 React UI 組件庫(kù),主要用于研發(fā)企業(yè)級(jí)中后臺(tái)產(chǎn)品,這篇文章主要介紹了Ant Design組件庫(kù)的使用教程,需要的朋友可以參考下
    2023-12-12
  • React高階組件優(yōu)化文件結(jié)構(gòu)流程詳解

    React高階組件優(yōu)化文件結(jié)構(gòu)流程詳解

    高階組件就是接受一個(gè)組件作為參數(shù)并返回一個(gè)新組件(功能增強(qiáng)的組件)的函數(shù)。這里需要注意高階組件是一個(gè)函數(shù),并不是組件,這一點(diǎn)一定要注意,本文給大家分享React 高階組件HOC使用小結(jié),一起看看吧
    2023-01-01
  • 在React中應(yīng)用SOLID原則的方法

    在React中應(yīng)用SOLID原則的方法

    SOLID?是一套原則,它們主要是關(guān)心代碼質(zhì)量和可維護(hù)性的軟件專(zhuān)業(yè)人員的指導(dǎo)方針,本文給大家分享如何在React中應(yīng)用SOLID原則,感興趣的朋友一起看看吧
    2022-07-07
  • React中setState/useState的使用方法詳細(xì)介紹

    React中setState/useState的使用方法詳細(xì)介紹

    這篇文章主要介紹了React中setState/useState的使用方法,useState 和 setState 在React開(kāi)發(fā)過(guò)程中 使用很頻繁,但很多人都停留在簡(jiǎn)單的使用階段,并沒(méi)有正在了解它們的執(zhí)行機(jī)制
    2023-04-04
  • React Native 通告消息豎向輪播組件的封裝

    React Native 通告消息豎向輪播組件的封裝

    這篇文章主要介紹了React Native 通告消息豎向輪播組件的封裝,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Yarn安裝項(xiàng)目依賴(lài)報(bào)error?An?unexpected?error?occurred:?“XXXXX:ESOCKETTIMEOUT”問(wèn)題解決

    Yarn安裝項(xiàng)目依賴(lài)報(bào)error?An?unexpected?error?occurred:?“XXXXX:E

    這篇文章主要為大家介紹了Yarn安裝項(xiàng)目依賴(lài)報(bào)error?An?unexpected?error?occurred:?“XXXXX:ESOCKETTIMEOUT”問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • 學(xué)習(xí)React中ref的兩個(gè)demo示例

    學(xué)習(xí)React中ref的兩個(gè)demo示例

    這篇文章主要介紹了學(xué)習(xí)React中ref的兩個(gè)demo示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08

最新評(píng)論