- 配置参考 Configuration
- 入门指南
- 介绍 Introduction
- 安装 Installation
- 配置 Configuration
- 视图 Views
- 资产 Assets
- 路由 Routing
- SEO and Meta
- 过渡 Transitions
- 数据获取 Data Fetching
- 状态管理 State Management
- 错误处理 Error handling
- 层结构 Layers
- 部署 Deployment
- 测试 Testing
- 升级指南 Upgrade Guide
- 核心概念
- 自动导入 Auto imports
- Vue.Js Vue.js Development
- 渲染模式 Rendering Modes
- 服务端引擎 Server Engine
- 模块化 Modules
- ES模块 ES Modules
- TypeScript TypeScript
- 目录结构
- 可组合项
- 组件
- 工具库
- fetch
- abortNavigation
- addRouteMiddleware
- clearError
- clearNuxtData
- createError
- defineNuxtComponent
- defineNuxtRouteMiddleware
- definePageMeta
- navigateTo
- onBeforeRouteLeave
- onBeforeRouteUpdate
- onNuxtReady
- prefetchComponents
- preloadComponents
- preloadRouteComponents
- refreshNuxtData
- reloadNuxtApp
- setPageLayout
- setResponseStatus
- showError
- updateAppConfig
- CLI 命令
- 进阶
- 深入探究
- 迁移指南
+ server
Nuxt 会自动扫描~/server/api
、~/server/routes
和~/server/middleware
目录中的文件,以注册 API 和服务器处理程序以支持 HMR。
每个文件都应该导出一个用 defineEventHandler() 定义的默认函数。
处理程序可以直接返回 JSON 数据、Promise
或使用 event.node.res.end()
发送响应。
基础示例
在 server/api 中创建一个新文件 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.tsexport default defineEventHandler(() => 'Hello World!')
在上面的示例中,可以在 http://localhost:3000/hello 访问 /hello
路由。
请注意,当前服务器路由不支持动态路由的完整功能,如pages。
服务器中间件
Nuxt 会自动读取 ~/server/middleware
中的任何文件,为您的项目创建服务器中间件。
中间件处理程序将在任何其他服务器路由之前针对每个请求运行,以添加或检查标头、记录请求或扩展事件的请求对象。
中间件处理程序不应该返回任何东西(也不关闭或响应请求)并且只检查或扩展请求上下文或抛出错误。
示例:
server/middleware/log.tsexport default defineEventHandler((event) => {
console.log('New request: ' + event.node.req.url)
})
server/middleware/auth.tsexport default defineEventHandler((event) => {
event.context.auth = { user: 123 }
})
服务器插件
Nuxt 将自动读取 ~/server/plugins
目录中的所有文件并将它们注册为 Nitro 插件。 这允许扩展 Nitro 的运行时行为并连接到生命周期事件中。
示例:
server/plugins/nitroPlugin.tsexport default defineNitroPlugin((nitroApp) => {
console.log('Nitro plugin', nitroApp)
})
服务器实用程序
服务器路由由 unjs/h3 提供支持,它带有一组方便的助手。
您可以自己在 ~/server/utils
目录中添加更多助手。
例如,您可以定义一个自定义处理程序实用程序,该实用程序包装原始处理程序并在返回最终响应之前执行其他操作。
Example:
server/utils/handler.tsimport 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 中nitro
和vue
自动导入之间的清晰度,您可以添加包含以下内容的~/server/tsconfig.json
{
"extends": "../.nuxt/tsconfig.server.json"
}
尽管现在在类型检查(nuxi typecheck
)时不会考虑这些值,但您应该在 IDE 中获得更好的类型提示。
基础用法示例
匹配路由参数Nitro 配置
您可以使用 nuxt.config
中的 nitro
键直接设置 Nitro 配置。
这是一个高级选项。 自定义配置会影响生产部署,因为当 Nitro 在 Nuxt 的 semver-minor 版本中升级时,配置界面可能会随着时间而改变。
nuxt.config.tsexport default defineNuxtConfig({
// https://www.wenjiangs.com/doc/nitro-guide-configuration
nitro: {}
})
使用嵌套路由器
server/api/hello/[...slug].tsimport { 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.tsimport fs from 'node:fs'
import { sendStream } from 'h3'
export default defineEventHandler((event) => {
return sendStream(event, fs.createReadStream('/path/to/file'))
})
发送重定向
server/api/foo.get.tsexport default defineEventHandler((event) => {
return sendRedirect(event, '/path/redirect/to', 302)
})
返回传统的处理程序或中间件
server/api/legacy.tsexport default fromNodeMiddleware((req, res) => {
res.end('Legacy handler')
})
使用 unjs/h3 可以提供旧版支持,但建议尽可能避免使用旧版处理程序。
server/middleware/legacy.tsexport default fromNodeMiddleware((req, res, next) => {
console.log('Legacy middleware')
next()
})
切勿将 next()
回调与 async
或返回 Promise
的遗留中间件结合使用!
服务器存储
Nitro 提供了一个跨平台的存储层。
为了配置额外的存储挂载点,您可以使用 nitro.storage
。
使用 Redis 示例:
nuxt.config.tsexport 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
中创建一个新文件:
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
中创建一个新文件:
export default defineEventHandler(async (event) => {
const data = await useStorage().getItem('redis:test')
return data
})
在 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论