返回介绍

+ server

发布于 2024-04-18 00:42:19 字数 7080 浏览 0 评论 0 收藏 0

server目录用于将 API 和服务器处理程序注册到您的应用程序。

Nuxt 会自动扫描~/server/api~/server/routes~/server/middleware 目录中的文件,以注册 API 和服务器处理程序以支持 HMR。

每个文件都应该导出一个用 defineEventHandler() 定义的默认函数。

处理程序可以直接返回 JSON 数据、Promise 或使用 event.node.res.end() 发送响应。

Nitro 路由处理文档

基础示例

在 server/api 中创建一个新文件 server/api/hello.ts:

server/api/hello.ts
export default defineEventHandler((event) => {
  return {
    api: 'works'
  }
})

您现在可以使用 await $fetch('/api/hello') 普遍调用此 API。

服务器路由

~/server/api 中的文件在其路由中自动以 /api 为前缀。 要添加不带 /api 前缀的服务器路由,您可以将它们放入 ~/server/routes 目录。

示例:

server/routes/hello.ts
export default defineEventHandler(() => 'Hello World!')

在上面的示例中,可以在 http://localhost:3000/hello 访问 /hello 路由。

请注意,当前服务器路由不支持动态路由的完整功能,如pages

服务器中间件

Nuxt 会自动读取 ~/server/middleware 中的任何文件,为您的项目创建服务器中间件。

中间件处理程序将在任何其他服务器路由之前针对每个请求运行,以添加或检查标头、记录请求或扩展事件的请求对象。

中间件处理程序不应该返回任何东西(也不关闭或响应请求)并且只检查或扩展请求上下文或抛出错误。

示例:

server/middleware/log.ts
export default defineEventHandler((event) => {
  console.log('New request: ' + event.node.req.url)
})
server/middleware/auth.ts
export default defineEventHandler((event) => {
  event.context.auth = { user: 123 }
})

服务器插件

Nuxt 将自动读取 ~/server/plugins 目录中的所有文件并将它们注册为 Nitro 插件。 这允许扩展 Nitro 的运行时行为并连接到生命周期事件中。

示例:

server/plugins/nitroPlugin.ts
export default defineNitroPlugin((nitroApp) => {
  console.log('Nitro plugin', nitroApp)
})

Nitro Plugins

服务器实用程序

服务器路由由 unjs/h3 提供支持,它带有一组方便的助手。

可用的 H3 请求助手

您可以自己在 ~/server/utils 目录中添加更多助手。

例如,您可以定义一个自定义处理程序实用程序,该实用程序包装原始处理程序并在返回最终响应之前执行其他操作。

Example:

server/utils/handler.ts
import type { EventHandler } from 'h3'

export const defineWrappedResponseHandler = (handler: EventHandler) =>
  defineEventHandler(async (event) => {
    try {
      // 在路由处理程序之前做一些事情
      const response = await handler(event)
      // 在路由处理程序之后做一些事情
      return { response }
    } catch (err) {
      // 错误处理
      return { err }
    }
  })

服务器类型

此功能可从 Nuxt >= 3.5 开始使用

为了提高 IDE 中nitrovue自动导入之间的清晰度,您可以添加包含以下内容的~/server/tsconfig.json

server/tsconfig.json
{
  "extends": "../.nuxt/tsconfig.server.json"
}

尽管现在在类型检查(nuxi typecheck)时不会考虑这些值,但您应该在 IDE 中获得更好的类型提示。

基础用法示例

匹配路由参数

Nitro 配置

您可以使用 nuxt.config 中的 nitro 键直接设置 Nitro 配置

这是一个高级选项。 自定义配置会影响生产部署,因为当 Nitro 在 Nuxt 的 semver-minor 版本中升级时,配置界面可能会随着时间而改变。

nuxt.config.ts
export default defineNuxtConfig({
  // https://www.wenjiangs.com/doc/nitro-guide-configuration
  nitro: {}
})

使用嵌套路由器

server/api/hello/[...slug].ts
import { createRouter, defineEventHandler, useBase } from 'h3'

const router = createRouter()

router.get('/test', defineEventHandler(() => 'Hello World'))

export default useBase('/api/hello', router.handler)

发送流(实验)

这是一项实验性功能,仅在 Node.js 环境中可用。

server/api/foo.get.ts
import fs from 'node:fs'
import { sendStream } from 'h3'

export default defineEventHandler((event) => {
  return sendStream(event, fs.createReadStream('/path/to/file'))
})

发送重定向

server/api/foo.get.ts
export default defineEventHandler((event) => {
  return sendRedirect(event, '/path/redirect/to', 302)
})

返回传统的处理程序或中间件

server/api/legacy.ts
export default fromNodeMiddleware((req, res) => {
  res.end('Legacy handler')
})

使用 unjs/h3 可以提供旧版支持,但建议尽可能避免使用旧版处理程序。

server/middleware/legacy.ts
export default fromNodeMiddleware((req, res, next) => {
  console.log('Legacy middleware')
  next()
})

切勿将 next() 回调与 async 或返回 Promise 的遗留中间件结合使用!

服务器存储

Nitro 提供了一个跨平台的存储层

为了配置额外的存储挂载点,您可以使用 nitro.storage

使用 Redis 示例:

nuxt.config.ts
export default defineNuxtConfig({
  nitro: {
    storage: {
      'redis': {
        driver: 'redis',
        /* redis connector options */
        port: 6379, // Redis port
        host: "127.0.0.1", // Redis host
        username: "", // needs Redis >= 6
        password: "",
        db: 0, // Defaults to 0
        tls: {} // tls/ssl
      }
    }
  }
})

server/api/test.post.ts 中创建一个新文件:

server/api/test.post.ts
export default defineEventHandler(async (event) => {
  const body = await readBody(event)
  await useStorage().setItem('redis:test', body)
  return 'Data is set'
})

server/api/test.get.ts 中创建一个新文件:

server/api/test.get.ts
export default defineEventHandler(async (event) => {
  const data = await useStorage().getItem('redis:test')
  return data
})

app.vue 中创建一个新文件:

app.vue
<template>
  <div>
    <div>Post state: {{ resDataSuccess }}</div>
    <div>Get Data: {{ resData.text }}</div>
  </div>
</template>

<script setup lang="ts">
  const { data: resDataSuccess } = await useFetch('/api/test', {
      method: 'post',
      body: { text: 'Nuxt is Awesome!' }
  })
  const { data: resData } = await useFetch('/api/test')
</script>
相关阅读:server

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文