ソース情報
- リポジトリ
- involvex/noobify-app
- ソースの最終更新活動
- 2026年7月1日 23:47
- 検出された SKILL.md の言語
- 英語
- スター
- 0
- フォーク
- 0
インストール方法
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
ソースファイルを確認
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
メニュー
デフォルトでは、最初にソースを確認する Prompt が選択されています。直接コマンドに切り替えるか、ローカルコピーをダウンロードすることもできます。
インストールを決める前に、SKILL.md と SkillsMP に表示されている付属ファイルをお読みください。
SOC 職業分類に基づく
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
直接コマンドでは確認用 Prompt が省略されます。実行前にソースを確認してください。
npx skills add https://github.com/involvex/noobify-app --skill expo-api-routesコマンドは1行のまま表示されます。コピー前に横へスクロールして全体を確認してください。
ローカルで確認しますか?SkillsMP が現在取得できるファイルをダウンロードできます。
SKILL.md を表示中
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.
| 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())
}