maplestory/backend/routes/character.js
caadiq 7b6a821f36 보스 결정 사용자 페이지 + UI/UX 개선
레이아웃:
- 풀스크린 모드 컨텍스트 (BossCrystal 페이지에서 푸터 숨김 + viewport 고정)
- 캐릭터 패널: 자연 높이 + viewport 한도 + 내부 목록 스크롤
- 보스 패널: 헤더 고정 + 목록 내부 스크롤
- 커스텀 스크롤바 (전역)

캐릭터 패널:
- framer-motion Reorder로 드래그앤드롭 정렬
- 가로 캐릭터 행 + 6x2 보스 그리드 + 난이도 영문 첫글자 뱃지
- 총 수익에 ResizeObserver 기반 자동 폰트 fit
- 캐릭터 삭제 시 첫번째 자동 선택, 입력 재개 시 에러 메시지 자동 제거

기능:
- 공개 보스/캐릭터 API 추가
- API 키 라이브 키로 변경

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:17:49 +09:00

42 lines
1.4 KiB
JavaScript

import { Router } from 'express';
import axios from 'axios';
const router = Router();
const NEXON_API_BASE = 'https://open.api.nexon.com';
// 캐릭터 닉네임으로 정보 조회
router.get('/search', async (req, res) => {
const { name } = req.query;
if (!name?.trim()) return res.status(400).json({ error: '캐릭터 닉네임을 입력해주세요' });
try {
// 1) ocid 조회
const { data: idData } = await axios.get(`${NEXON_API_BASE}/maplestory/v1/id`, {
params: { character_name: name.trim() },
headers: { 'x-nxopen-api-key': process.env.NEXON_API_KEY },
});
// 2) basic 조회
const { data: basic } = await axios.get(`${NEXON_API_BASE}/maplestory/v1/character/basic`, {
params: { ocid: idData.ocid },
headers: { 'x-nxopen-api-key': process.env.NEXON_API_KEY },
});
res.json({
ocid: idData.ocid,
character_name: basic.character_name,
world_name: basic.world_name,
job_name: basic.character_class,
character_level: basic.character_level,
character_image: basic.character_image,
});
} catch (err) {
if (err.response?.status === 400) {
return res.status(404).json({ error: '존재하지 않는 캐릭터입니다' });
}
console.error('캐릭터 조회 오류:', err.response?.data || err.message);
res.status(500).json({ error: '캐릭터 조회 실패' });
}
});
export default router;