ソース情報
- リポジトリ
- involvex/noobify-app
- ソースの最終更新活動
- 2026年7月1日 23:47
- 検出された SKILL.md の言語
- 英語
- スター
- 0
- フォーク
- 0
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
メニュー
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/involvex/noobify-app --skill expo-api-routesコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
Complete guide for building beautiful apps with Expo Router. Covers fundamentals, styling, components, navigation, animations, patterns, and native tabs.
Set up Tailwind CSS v4 in Expo with react-native-css and NativeWind v5 for universal styling
Add an iOS App Clip target to an Expo app. Use when the user mentions App Clip, AASA, apple-app-site-association, appclips, smart app banner, or wants to ship a lightweight iOS Clip invoked from a URL alongside their parent app.
SOC 職業分類に基づく
SKILL.md を表示中
| name | expo-api-routes |
| description | Guidelines for creating API routes in Expo Router with EAS Hosting |
| version | 1.0.0 |
| license | MIT |
Use API routes when you need:
Avoid API routes when:
API routes live in the app directory with +api.ts suffix:
app/
api/
hello+api.ts → GET /api/hello
users+api.ts → /api/users
users/[id]+api.ts → /api/users/:id
(tabs)/
index.tsx
// app/api/hello+api.ts
export function GET(request: Request) {
return Response.json({message: 'Hello from Expo!'})
}
Export named functions for each HTTP method:
// app/api/items+api.ts
export function GET(request: Request) {
return Response.json({items: []})
}
export async function POST(request: Request) {
const body = await request.json()
return Response.json({created: body}, {status: 201})
}
export async function PUT(request: Request) {
const body = await request.json()
return Response.json({updated: body})
}
export async function DELETE(request: Request) {
return new Response(null, {status: 204})
}
// app/api/users/[id]+api.ts
export function GET(request: Request, {id}: {id: string}) {
return Response.json({userId: id})
}
export function GET(request: Request) {
const url = new URL(request.url)
const page = url.searchParams.get('page') ?? '1'
const limit = url.searchParams.get('limit') ?? '10'
return Response.json({page, limit})
}
export function GET(request: Request) {
const auth = request.headers.get('Authorization')
if (!auth) {
return Response.json({error: 'Unauthorized'}, {status: 401})
}
return Response.json({authenticated: true})
}
export async function POST(request: Request) {
const {email, password} = await request.json()
if (!email || !password) {
return Response.json({error: 'Missing fields'}, {status: 400})
}
return Response.json({success: true})
}
Use process.env for server-side secrets:
// app/api/ai+api.ts
export async function POST(request: Request) {
const {prompt} = await request.json()
const response = await fetch('https://api.openai.com/v1/chat/completions', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
},
body: JSON.stringify({
model: 'gpt-4',
messages: [{role: 'user', content: prompt}],
}),
})
const data = await response.json()
return Response.json(data)
}
Set environment variables:
.env file (never commit)eas env:create or Expo dashboardAdd CORS for web clients:
const corsHeaders = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
}
export function OPTIONS() {
return new Response(null, {headers: corsHeaders})
}
export function GET() {
return Response.json({data: 'value'}, {headers: corsHeaders})
}
export async function POST(request: Request) {
try {
const body = await request.json()
// Process...
return Response.json({success: true})
} catch (error) {
console.error('API error:', error)
return Response.json({error: 'Internal server error'}, {status: 500})
}
}
Start the development server with API routes:
npx expo serve
This starts a local server at http://localhost:8081 with full API route support.
Test with curl:
curl http://localhost:8081/api/hello
curl -X POST http://localhost:8081/api/users -H "Content-Type: application/json" -d '{"name":"Test"}'
npm install -g eas-cli
eas login
eas deploy
This builds and deploys your API routes to EAS Hosting (Cloudflare Workers).
# Create a secret
eas env:create --name OPENAI_API_KEY --value sk-xxx --environment production
# Or use the Expo dashboard
Configure in eas.json or Expo dashboard.
API routes run on Cloudflare Workers. Key limitations:
fs module unavailable// Use Web Crypto instead of Node crypto
const hash = await crypto.subtle.digest(
'SHA-256',
new TextEncoder().encode('data'),
)
// Use fetch instead of node-fetch
const response = await fetch('https://api.example.com')
// Use Response/Request (already available)
return new Response(JSON.stringify(data), {
headers: {'Content-Type': 'application/json'},
})
Since filesystem is unavailable, use cloud databases:
Example with Turso:
// app/api/users+api.ts
import {createClient} from '@libsql/client/web'
const db = createClient({
url: process.env.TURSO_URL!,
authToken: process.env.TURSO_AUTH_TOKEN!,
})
export async function GET() {
const result = await db.execute('SELECT * FROM users')
return Response.json(result.rows)
}
// From React Native components
const response = await fetch('/api/hello')
const data = await response.json()
// With body
const response = await fetch('/api/users', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({name: 'John'}),
})
// utils/auth.ts
export async function requireAuth(request: Request) {
const token = request.headers.get('Authorization')?.replace('Bearer ', '')
if (!token) {
throw new Response(JSON.stringify({error: 'Unauthorized'}), {
status: 401,
headers: {'Content-Type': 'application/json'},
})
}
// Verify token...
return {userId: '123'}
}
// app/api/protected+api.ts
import {requireAuth} from '../../utils/auth'
export async function GET(request: Request) {
const {userId} = await requireAuth(request)
return Response.json({userId})
}
// app/api/weather+api.ts
export async function GET(request: Request) {
const url = new URL(request.url)
const city = url.searchParams.get('city')
const response = await fetch(
`https://api.weather.com/v1/current?city=${city}&key=${process.env.WEATHER_API_KEY}`,
)
return Response.json(await response.json())
}