Nuxt3 использует узел для рендеринга страниц SSR и поставляется с H3 для обработки интерфейса.
Nuxt3 Автоматическое сканирование ~/server/api
,~/server/routes
,~/server/middleware
Файлы в каталоге для регистрации соответствующего интерфейса
Прямо сейчас Структура каталоговдля↓,доступ/api/login Это возвращаемое содержимое интерфейса
Здесь следует отметить, что если мы используем прокси и используем nuxt3 для записи интерфейса, мы не можем использовать api в качестве имени прокси при проксировании, иначе доступ будет проксироваться на соответствующий адрес.
|-- server
|-- api //Имя по умолчанию не может быть изменено
|-- login.post.ts //опубликовать и получить имя файла Представляет тип полученного запроса.
|-- userInfo.get.ts // здесь представляет собой запрос на получение
|-- detail
|--[id].get.ts //С динамической маршрутизацией Метод передачи параметров вводит параметры
userInfo.get.ts
// Исправлен возврат метода defineEventHandler.
export default defineEventHandler(event => {
// Принятые события Содержит узел запрос и метод разрешения
const query = getQuery(event) // getQuery — это глобальный метод, который можно вызывать напрямую.
const { id } = query
return {
msg: `Запрос Личная информация ${id}`
}
})
Проекты, работающие в настоящее время Открыть напрямую http://localhost:3000/api/userInfo?id=23
Содержимое страницы
{
msg: `Запрос 23 личная информация`
}
login.post.ts
// Исправлен возврат метода defineEventHandler.
export default defineEventHandler(async event => {
const body = await readBody(event) //readBody — это глобально инкапсулированный метод получения тела
const { username, password } = body
//Определяем параметры, которые нужно передать Данные пусты, и сообщается об ошибке.
if (!username || !password) {
// createError может напрямую выдавать ошибки
throw createError({
statusCode: 400,
statusMessage: «Имя пользователя и пароль не могут быть пустыми»
})
}
//Операции с базой данных
return {
mes: `Данные ${username} успешно сохранены, вход выполнен успешно`
}
})
page/login.vue
Вот страница входа, написанная в том же проекте для проверки некоторых функций этого запроса.
(elementplus прописан в плагине проекта) и может использоваться напрямую.
<template>
<div class="mod-login">
<el-form
ref="ruleFormRef"
:model="ruleForm"
:rules="rules"
label-width="120px"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form-item label="User Name" prop="name">
<el-input v-model="ruleForm.name" placeholder="Please User Name" />
</el-form-item>
<el-form-item label="Password" prop="name">
<el-input
v-model="ruleForm.password"
type="password"
placeholder="Please input password"
show-password
/>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="submitForm(ruleFormRef)"> Create </el-button>
<el-button @click="resetForm(ruleFormRef)">Reset</el-button>
</el-form-item>
</el-form>
</div>
</template>
<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'
interface RuleForm {
name: string
password: string
}
const formSize = ref('default')
const ruleFormRef = ref<FormInstance>()
const ruleForm = reactive<RuleForm>({
name: '',
password: ''
})
const rules = reactive<FormRules<RuleForm>>({
name: [
{ required: true, message: 'Please input username', trigger: 'blur' },
{ min: 3, max: 5, message: 'Length should be 3 to 5', trigger: 'blur' }
],
password: [
{ required: true, message: 'Please input password', trigger: 'blur' },
{ min: 8, max: 15, message: 'Length should be 8 to 15', trigger: 'blur' }
]
})
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate(async (valid, fields) => {
if (valid) {
const { data } = await useLazyFetch('/api/login', {
method: 'post',
body: JSON.stringify({
// параметры запроса публикации
username: ruleForm.name,
password: ruleForm.password
})
})
} else {
console.log('error submit!', fields)
}
})
}
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
</script>
<style lang="scss">
.mod-login {
padding: 300px;
}
</style>
Возвращаемый контент, напечатанный здесь, — это контент, возвращаемый запросом интерфейса.
{
"__v_isShallow": false,
"__v_isRef": true,
"_rawValue": {
"mes": «Данные sejas успешно сохранены, вход выполнен успешно»
},
"_value": {
"mes": «Данные sejas успешно сохранены, вход выполнен успешно»
}
}
[id].get.js
здесь Если наш запрос должен быть http://localhost:3000/api/detail/8788
export default defineEventHandler(event => {
// здесь прошел event.context.params.id, чтобы получить идентификатор ценить
const id = event.context.params?.id
return {
msg: `Запрос Подробная информация о ${id}`
}
})
Узел может напрямую подключаться к базе данных в качестве внутреннего интерфейса. Вы также можете использовать узел в качестве среднего уровня для запроса других интерфейсов на сервере, обработки данных и возврата их на страницу.
существовать Сервер инициирует запрос, используя$fetch
вместоuseLazyFetch
// Исправлен экспорт метода defineEventHandle.
export default defineEventHandler(async event => {
// здесь прошел event.context.params.id, чтобы получить идентификатор ценить
const id = event.context.params?.id
// Я позвонил сюда Только что написанная информация о пользователе интерфейс, содержимое, возвращаемое в это время,
// msg: `Запрос 23 личная информация`
// Можно использовать parseCookies напрямую получает файл cookie клиента
const cookie = parseCookies(event)
const res = await $fetch(`/api/userInfo?id=${id}`)
return res
})
Среди событий даdefineEventHandler
Параметры
имя | эффект |
---|---|
getQuery(event) | Метод get принимает параметры запроса |
readBody(event) | Метод post получает тело параметра запроса. |
const id = event.context.params?.id | Получить параметр param, переданный по динамическому пути,Идентификатор соответствует имени файла |
parseCookies(event) | Получить куки с сервера |