본문 바로가기
핀테크 서비스 프론트엔드 개발자 취업 완성 2기/학습일지

[TIL] nodejs로 만든 api heroku로 api를 배포해보기!!

by flyda 2022. 7. 18.

https://dashboard.heroku.com/apps

 

nodemon 을 설치하기 

npm start //헤로쿠에서 배포할때 start아니면 돈내야함 

 

 

버전을 다르게 하고 싶으면..? 파일만 일단 구분해서 하면 된다아앙!! v1/todos.js나 v2/todos.js이라고 생각하면 된다!! 

 

//router/api/todos

const express = require('express')

const router = express.Router()

//작업

module.export = router

 

 

RESTful API 

router.delete('/:id', (req, res) => {  //삭제 // 제일 적합 
  console.log('req.params::',req.params) 
  res.status(200).json(true)

})

router.delete('/:id', (req, res) => {  //삭제
  console.log('req.body::',req.body)
  const {id} = req.body // body에 담아서 요청하도록 할 수 있다!! 
  res.status(200).json(true)

})

router.post('/delete', (req, res) => {  //삭제
  console.log('req.body::',req.body)
  const {id} = req.body // body에 담아서 요청하도록 할 수 있다!! 
  res.status(200).json(true)

})

rest api는 표준이 없기때문에 다양한 스타일을 가질 수 있다. 

 

 

//todos.js 연습!! 
const express = require('express')

const router = express.Router()

//작업

//api/todos/
router.get('/', (req, res) => {
  console.log('req.query:::',req.query) //http://localhost:1234/api/todos?a=1&b=dayoung 에서 { a: '1', b: 'dayoung' }로 객체데이터로 내어줌
  
  const { apikey } = req.query
  const validApiKeies = [123456, 123457, 851216 ] //db에서 받아왔다고 치고!!

  // console.log(apikey.toFixed(2))//문자데이터에 숫자처럼 처리하면 500에러...

  if( !validApiKeies.includes(Number(apikey)))  { //만약 api키가 없으면 
    return res.status(401).json('유효한 정보가 아닙니다.') // 너무 상세하게 제공해주면 해킹하는 사람이 좋아한다 앗 비번이 틀렸구나?!!
  }
  return res.status(200).json({ //json 메서드가 JSON.stringify()를 자동으로 해줘서 해줄 필요가 없다.  // if문 안에서 return값을 줬으면 다른 부분에서도 return이 있도록 해주는 것이 좋다!! 
    name: 'First Todos Api!!'
  })
})

router.post('/', (req, res) => {
  console.log('req.body::',req.body)
  res.status(200).json(true)

})

//https://abc.com/api/todos/1231423
router.put('/:id', (req, res) => {  //수정
  console.log('req.params::',req.params)
  res.status(200).json(true)

})

router.delete('/:id', (req, res) => {  //삭제 // 제일 적합 
  console.log('req.params::',req.params) 
  res.status(200).json(true)

})

module.exports = router

 

 

지금은 db가 연결되지 않은 상태기 때문에 파일에 데이터를 저장하도록 관리할 예정이다!! 

 

헤로쿠같은 경우에는 fs로 만들었을 때 재배포를하면 파일 내용이 누적이 되는 것이 아니라 그냥 날라가고 초기화가 된다!! 

 

헤로쿠에 배포하고 잘 동작이 되었던 배포본!!1 

 

//index.js
const express = require('express')
const cors = require('cors')

global.appRoot = __dirname

const app = express()
app.use(express.json())
// app.use(cors({ // 화이트 리스트!! 내가 적은 곳만 허용할 것이다!!
//   origin: ['http://naver.com']
// }))

app.use(cors())
//http://localhost:1234/api/todos
app.use('/api/todos', require('./routes/api/todos.js') )

const port = process.env.PORT || 1234 //다른 환경에서도 이렇게 환경변수설정해주면 돌아감!! 로컬에서는 1234 
app.listen(port,()=> {
  console.log('서버 동작합니다!!')
})
//routes/api/todos.js
const fs = require('fs') // 내장 api (node js API : nodejs에서 가지고 있는 명령들/기능들 정도로 이해하면 좋음!! )
const { nanoid } = require('nanoid')
const express = require('express')

const router = express.Router()

const todosDir = `${global.appRoot}/todos`
const todosFile = `${global.appRoot}/todos/index.json`

//Read
router.get('/', (req, res) => {
  const todos =JSON.parse( fs.readFileSync(todosFile,'utf8'))
  res.status(200).json(todos)

})


//Create
router.post('/', (req, res) => {
  const { title }  = req.body

  let todos = {}
  try {
    todos = JSON.parse(fs.readFileSync(todosFile, {encoding:'utf8'})) //최상위 경로에서 todos폴더를 불러와라!!

  }catch(e) {
    fs.mkdirSync(todosDir)
    fs.writeFileSync(todosFile, '{}')//두번째 인수는 데이터!! 
  }

  todos[nanoid()] = { title }
  fs.writeFileSync(todosFile, JSON.stringify(todos, null, 2))// 두번째 세번째는 예쁘게 보이려고 하는거임!!

  res.status(200).json({title})
})

//Updateyyu7y77
router.put('/:id', (req, res) => {  
  const {id}  =  req.params
  const { title } = req.body
 const todos = JSON.parse( fs.readFileSync(todosFile, 'utf8'))
 todos[id].title = title

 fs.writeFileSync(todosFile, JSON.stringify(todos, null, 2))
 res.status(200).json(todos[id])
})

//Delete
router.delete('/:id', (req, res) => {  
  const {id}  =  req.params
  const todos = JSON.parse( fs.readFileSync(todosFile, 'utf8'))
  delete todos[id]
  fs.writeFileSync(todosFile, JSON.stringify(todos, null, 2))
  res.status(200).json(true)
})

module.exports = router

 

다음시간엔 강사님 몽고디비를 간단하게 연결해볼 예정이다! 

npm i mongoose 

몽고디비를 제어하는 패키지 !

댓글