use server
use server
ディレクティブは、サーバーサイドで実行する関数またはファイルを指定します。ファイルの先頭に配置することで、ファイル内のすべての関数がサーバーサイドであることを示したり、関数の先頭にインラインで配置してその関数をServer Functionとしてマークしたりすることができます。これはReactの機能です。
ファイルの先頭での use server
の使用
以下の例は、ファイルの先頭にuse server
ディレクティブを持つファイルを示しています。このファイル内のすべての関数はサーバーで実行されます。
- TypeScript
- JavaScript
app/actions.ts
'use server'
import { db } from '@/lib/db' // あなたのデータベースクライアント
export async function createUser(data: { name: string; email: string }) {
const user = await db.user.create({ data })
return user
}
app/actions.js
'use server'
import { db } from '@/lib/db' // あなたのデータベースクライアント
export async function createUser(data) {
const user = await db.user.create({ data })
return user
}
クライアントコンポーネントでのサーバー関数の使用
サーバー関数をクライアントコンポーネントで使用するには、ファイルの先頭にuse server
ディレクティブを使用して専用のファイルでサーバー関数を作成する必要があります。これらのサーバー関数はクライアントとサーバーコンポーネントにインポートして実行できます。
actions.ts
にfetchUsers
というサーバー関数があると仮定します:
- TypeScript
- JavaScript
app/actions.ts
'use server'
import { db } from '@/lib/db' // あなたのデータベースクライアント
export async function fetchUsers() {
const users = await db.user.findMany()
return users
}
app/actions.js
'use server'
import { db } from '@/lib/db' // あなたのデータベースクライアント
export async function fetchUsers() {
const users = await db.user.findMany()
return users
}
その後、クライアントコンポーネントでfetchUsers
サーバー関数をインポートし、クライアントサイドで実行できます。
- TypeScript
- JavaScript
app/components/my-button.tsx
'use client'
import { fetchUsers } from '../actions'
export default function MyButton() {
return <button onClick={() => fetchUsers()}>Fetch Users</button>
}
app/components/my-button.js
'use client'
import { fetchUsers } from '../actions'
export default function MyButton() {
return <button onClick={() => fetchUsers()}>Fetch Users</button>
}
インラインでの use server
の使用
次の例では、use server
が関数の先頭でインラインで使用され、Server Functionとしてマークされています:
- TypeScript
- JavaScript
app/page.tsx
import { db } from '@/lib/db' // あなたのデータベースクライアント
export default function UserList() {
async function fetchUsers() {
'use server'
const users = await db.user.findMany()
return users
}
return <button onClick={() => fetchUsers()}>Fetch Users</button>
}
app/page.js
import { db } from '@/lib/db' // あなたのデータベースクライアント
export default function UserList() {
async function fetchUsers() {
'use server'
const users = await db.user.findMany()
return users
}
return <button onClick={() => fetchUsers()}>Fetch Users</button>
}
セキュリティに関する考慮事項
use server
ディレクティブを使用する際には、すべてのサーバー側ロジックが安全であり、機密データが保護されていることを確認することが重要です。
認証と認可
機密性の高いサーバーサイドの操作を行う前に、必ずユーザーを認証および認可してください。
- TypeScript
- JavaScript
app/actions.ts
'use server'
import { db } from '@/lib/db' // あなたのデータベースクライアント
import { authenticate } from '@/lib/auth' // あなたの認証ライブラリ
export async function createUser(
data: { name: string; email: string },
token: string
) {
const user = authenticate(token)
if (!user) {
throw new Error('Unauthorized')
}
const newUser = await db.user.create({ data })
return newUser
}
app/actions.js
'use server'
import { db } from '@/lib/db' // あなたのデータベースクライアント
import { authenticate } from '@/lib/auth' // あなたの認証ライブラリ
export async function createUser(data, token) {
const user = authenticate(token)
if (!user) {
throw new Error('Unauthorized')
}
const newUser = await db.user.create({ data })
return newUser
}
参照
use server
に関する詳細はReact ドキュメントを参照してください。