페이지 이동 없이 서버에 요청을 보내고 응답을 받는 기술.
브라우저에서 객체를 제공하긴 하지만
사용방법이 복잡, 서버에서는 사용 불가.
(실험적 단계.)
axios.get('요청을 보낼 주소').then((result)=>.....
. catch((error) => {.......
axios.get 내부에 new Promise가 들어있어
then, catch 사용이 가능.
result, error를 인자로 받는다.
result.data에 서버로부터 보낸 데이터가 들어있다.
또한, 프로미스라 async, await 방식으로 변경 가능.
(async() => {
try {
const reult = await axios.get('...');
}
catch(error) {...}
})()
데이터를 서버로 보낼 수 있다.
전체적 구조는 유사하나 두번째 인수로 데이터를 보낸다.
const result = await axios.post('...', {
name : '...',
birth: 199, ...});
const formDate = new FormData();
formData.append('name','zerocho');
....
form 객체에 append 메서드로 키-값 형태로 추가 가능.
has는 주어진 키가 해당하는 값이 있는 여부,
get은 주어진 키에 해당하는 값을 하나 가져오고,
getAll은 전부 가져오며,
delete는 현재 키를 제거,
set은 현재 키를 수정.
formdata를 만든 뒤 axios로 서버에 보낸다.
try{
const formData = new FormData();
formData.append('name', 'zerocho');
const result = await axios.post('..URL', formData);
...
한글 주소를 이해하지 못한다면
서버에 따라 불가할 경우
window 객체의 메서드인 encodeURIComponent 메서드를 사용하자.
한글 주소 부분만 메서드로 감싼다.
axios.get('....${encodeURIComponet('한글')}...
받는쪽이 decodeURIComponent를 쓰면 해석할 수 있다.
보안 관련 없는 데이터를 HTML에 저장할수 있는 데이터 속성.
(data attribute..)
태그 속성으로 data-id="..." 식으로 쓰면
document.querySelector('li).dataset
같은 형태로 data 태그로 들어간 거 한번에 접근 가능.
반대로 이러한 접근으로 dataset에 추가해도
HTML에 태그가 추가 됨.
파일 별로 코드 집합을 관리하여 사용할 수 있음.
노드에는 두 가지 형식의 모듈을 사용.
모듈을 만들어보자.
const 변수 = 값;
module.exports = {
변수
};
다른 파일에서 이 파일을 불러오면
module.exports에 대입된 값을 사용할 수 있다.
const { 변수 } = require('./경로');
경로만 잘 지정하면 다른 폴더에 있는 파일도
모듈로 사용할 수 있다.
js, json 같은 확장자는 생략할 수 있다.
exports에는 객체 말고도
함수나 변수를 대입할 수도 있다.
이것 외에도...
exports.변수 = '값'ㅣ
도 가능하다.
왜냐하면,
module.exports=== exports 이기때문!
단, 서로의 참조 관계가 깨질수도 있어서
(exports는 객체만 받음...)
한 모듈에 두개를 동시에 사용하진 말자.
또, 노드에서 this는
이 module.exports를 가리킨다.
(함수 선언문 내부에서는 global 객체를 가리킴.)
require은 함수고,
객체이므로,
객체로서 속성을 몇개 갖고 있다.
우리가 알아볼 것은...
알아둘 것은...
서로 require한다면...
공식 자바스크립트 모듈 형식.
브라우저에도 사용 가능하다는 장점.
export const odd = '...';export default checkOddOrEven;import {odd} from './경로';type :"module 속성을 넣자.두 모듈은 잘 호환되지 않으니
한 가지 형식만 쓰자!
조건부로 모듈을 불러오는 경우...
if(a) { require('./..') 시
조건에 따라 실행 되는걸 동적 불러오기라고 한다.
if(a) {
const m1 = await import('./func.mjs');
import 함수는 Promise를 반환하므로 await나 then을 붙여야한다.
async를 붙일 필요는 없는게, 최상위 스코프에서는 가능.(ES모듈 한정.)
파일 사이에 모듈 관계를 맺기 위해서는
현재 파일 경로, 파일 명을 잘 알아야한다.
그를 위한 편의 기능.
__filename 파일 이름까지 포함한 경로__dirname 파일이 들어있는 폴더의 경로.OS에 따라 경로가 다르기때문에...
이를 해결해주는 path 모듈을 보통 같이 쓴다.
그러나, ES 모듈에서는 이 둘이 사용불가.
대신 import.meta.url 로 호출 가능.
브라우저의 window 객체처럼 설치하지 않아도 바로 사용 가능.
window와 같은 전역 객체.
모든 파일에서 접근 가능.
애초에 require도
global.require임.
(window.open에서 open만으로 되는 것과 같은 원리.)
단, 노드에는 window, document 객체가 사용 불가하여
이를 모두 아우르는 globalThis를 쓰기도 함.
global은 어떤 파일에서 값을 대입했는지 찾기 힘드니까
사실 global로 주고받기 보다
모듈 형식으로 만든 후,
명시적으로 값을 불러와 사용하는 것을 추천.
디버깅 용으로 알차게 쓰자.
기본은 콜백 기반이지만
프로미스 방식을 쓸수도 있다.
단, 프로미스 방식을 쓴다면
노드 내장 객체가 아니라
노드 내장 모듈이라 import 해야한당.
import { setTimeout } from 'timers/promises'
await setTimeout(3000);
for await (const startTime of setInerval....
프로미스 기반이라 await 바로 사용하라고 ES 모듈로 예시를 듦.
setInterval은 for await of 문법으로 쓸 수 있다.