node.js
는 Chrome
의 v8
엔진을 기반으로 js
코드를 실행하므로 브라우저 환경을 없애고 다음 hello world
같이 콘솔에서 직접 js
코드를 실행할 수 있습니다. hello world
code
console.log('hello world');
콘솔에서 node
사용하여 직접 실행할 수 있습니다.
http
node.js
내장 모듈인 http
는 CommonJS
사양을 기반으로 http
모듈 http
require
사용할 수 createServer
. 서버는 콜백 함수를 매개변수로 받습니다. 이 콜백 함수 http
request
과 response
두 가지 매개변수를 받습니다.
request
url
, 요청 header
, 요청 메소드 및 클라이언트가 요청한 모든 정보가 포함됩니다. 요청 본문response
주로 정보를 반환하는 데 사용됩니다. 클라이언트는 응답 본문과 관련된 일부 작업을 캡슐화합니다. 예를 들어 response.writeHead
메서드를 사용하면 반환 본문의 헤더 정보와 상태 코드를 사용자 정의할 수 있습니다. 응답 본문을 호출하면 response.end()
메서드를 클라이언트에 보낼 수 있습니다. createServer
함수를 사용하면 Server
객체가 생성될 뿐, 수신할 수는 없습니다. 실제로 listen
메서드를 서버로 실행하기 시작할 수 server
listen
첫 번째 매개변수는 수신 대기 포트 번호이고, 두 번째 매개변수는 바인딩된 호스트 ip
이며, 세 번째 매개변수는 콜백 함수입니다. 오류가 발생하면 콜백 함수의 첫 번째 매개변수에서 예외를 얻을 수 있습니다 http
다음은
서버를 더욱 강력하게 만들기 위해 예외를 처리하도록 선택할 수 있습니다.http
모듈을 사용하여 간단한 서버 만들기
const { createServer } = require('http' ); const HOST = '로컬호스트'; const 포트 = '8080'; const 서버 = createServer((req, resp) => { // 첫 번째 매개변수는 반환되는 상태 코드입니다. // 두 번째 매개변수는 응답 헤더 정보입니다. resp.writeHead(200, { 'Content-Type': 'text/plain' }); console.log('서버가 작동 중입니다...'); // 요청이 완료되었음을 서버에 알리기 위해 end 메소드를 호출합니다. resp.end('hello nodejs http 서버'); }); server.listen(PORT, HOST, (오류) => { if (오류) { console.log('뭔가 잘못되었습니다: ', error); 반품; } console.log(`서버가 http://${HOST}:${PORT} ...에서 수신 중입니다.`); });
node
사용하여 직접 실행해보고 자신만의 서버를 만들 수 있습니다! 서버가 실행된 후 브라우저는 http://localhost:8080에 접속하여 서버에 접근할 수 있습니다.
nodemon
사용하여 실행할 수도 있으므로 코드가 변경될 때 프로그램을 수동으로 종료하고 다시 실행할 필요가 없습니다
.
직접 사용할 수 있도록 전역으로 설치하는 것이 좋습니다. npx nodemon
node
명령을 nodemon
http-server.js로 변경하면 됩니다.
이전에 createServer
및 resp
객체를 사용할 때는 구문 프롬프트를 볼 수 없었습니다. 언제든지 확인하려면 공식 node
문서를 따라야 합니다.
개발에 ts
.d.tsts
사용하지 않고 프로젝트 초기화를 위해 구문 프롬프트 기능만 사용한다는 점에 유의하세요.
npm init -y
@types/node
-- pnpm i @types/node -D
jsconfig.json
파일을 생성하고 node_modules
제외하면 확인할 필요가 없습니다.{ "compilerOptions": { "checkJs": 참 }, "제외": ["node_modules", "**/node_modules/*"] }
위 코드에 실제로 오류가 있다는 것을 발견하셨는지 궁금합니다. checkJs
유형 오류를 확인하는 데 도움이 될 수 있습니다. 필요에 따라 이 기능을 켤지 여부를 선택할 수 있습니다. 확인을 켜면 매개변수 유형 불일치에 대한 메시지가 즉시 표시됩니다.
이때 listen
메소드 위에 마우스를 올리면 해당 메소드의 시그니처를 확인할 수 있습니다.
보시다시피 원래 port
매개변수는 number
유형이어야 하는데 정의할 때 string
유형이어서 일치하지 않았습니다. 8080
number
로 변경하면 관련 api
문서를 직접 볼 수 있습니다. 공식 node
열지 않고 문서를 찾아 확인하는 데 오랜 시간이 걸렸습니다.
. 우리의 간단한 http server
한 문장만 반환했는데, 여러 문장을 반환하는 것이 가능합니까? 이를 위해서는 resp
객체의 write
메소드를 사용해야 하며, 대신 write
메소드를 사용하면 end
end
한 번만 호출하면 됩니다. 매개변수를 전달하십시오. 응답 본문 전송 기능만 완료하도록 하십시오.
const { createServer } = require("http"); const HOST = "로컬호스트"; const 포트 = 8080; const 서버 = createServer((req, resp) => { resp.writeHead(200, { "Content-Type": "text/plain" }); console.log("서버가 작동 중입니다..."); // 로렘 문장을 작성합니다 resp.write("Lorem ipsum dolor sit amet consectetur adipisicing elit.n"); resp.write("Omnis eligendi aperiam delectus?n"); resp.write("자, 이제 그만!n"); resp.end(); }); server.listen(PORT, HOST, (오류) => { if (오류) { console.log("뭔가 잘못되었습니다: ", error); 반품; } console.log(`서버가 http://${HOST}:${PORT} ...에서 수신 중입니다.`); })
이번에는 세 개의 문장을 썼고 이제 효과는 다음과 같습니다.
브라우저에 문자열을 반환할 수 있을 뿐만 아니라 html
파일의 내용을 직접 읽고 결과적으로 브라우저에 반환할 수도 있습니다. 이를 위해서는 다른 Node.js
내장 모듈을 사용해야 합니다. fs
, 모듈은 파일 작업 기능을 제공합니다. fs.readFile
사용하여 파일을 비동기적으로 읽을 수 있지만 promise
객체를 반환하지 않으므로 파일을 읽은 후 작업을 처리하기 위해 콜백을 전달해야 합니다. fs.readFileSync
동기적으로 파일 읽기를 차단합니다. 여기서는 비동기 읽기를 선택합니다.
const { createServer } = require("http"); const fs = require("fs"); const HOST = "로컬호스트"; const PORT = 8080;const 서버 = createServer((req, resp) => { // MIME 유형을 text/plain에서 text/html로 변경합니다. resp.writeHead(200, { "Content-Type": "text/html" }); //html 파일 내용을 읽습니다. fs.readFile("index.html", (err, data) => { 만약 (오류) { 콘솔.오류( "html 파일 내용을 읽는 동안 오류가 발생했습니다: ", 실수 ); 오류가 발생했습니다. } console.log("작업 성공!"); resp.write(데이터); resp.end(); }); }); server.listen(PORT, HOST, (오류) => { if (오류) { console.log("뭔가 잘못되었습니다: ", error); 반품; } console.log(`서버가 http://${HOST}:${PORT} ...에서 수신 중입니다.`); });
현재 결과는 다음과 같습니다.
html
참고: 여기에서 응답 헤더의 **Content-Type**
**text/html**
로 변경하여 **html**
파일의 콘텐츠를 반환한다는 것을 브라우저에 알려야 합니다 . 계속해서 **text/plain**
사용하는 경우 브라우저는 반환된 콘텐츠를 구문 분석하지 않습니다. 이는 **html**
구문을 준수하더라도 다음과 같이 구문 분석되지 않습니다.
인터페이스 데이터 반환만 담당하는 백엔드 서버를 작성해야 하는 경우 콘텐츠를 json
형식으로 반환해야 합니다. 여러분은 똑똑하고 이를 처리하는 방법을 알고 있을 것입니다.
MIME
유형을 application/json
으로 설정하세요. application/json
resp.write
json
문자열이 전달됩니다. JSON.stringify
사용하여 객체를 처리하고 returnconst { createServer } = require("http"); const HOST = "로컬호스트"; const 포트 = 8080; const 서버 = createServer((req, resp) => { // MIME 유형을 application/json으로 변경합니다. resp.writeHead(200, { "Content-Type": "application/json" }); //객체를 사용하여 json 데이터 생성 const jsonDataObj = { 코드: 0, 메시지: "성공", 데이터: { 이름: "플라스틱", 나이: 20, 취미: "코딩", }, }; resp.write(JSON.stringify(jsonDataObj)); resp.end(); }); server.listen(PORT, HOST, (오류) => { if (오류) { console.log("뭔가 잘못되었습니다: ", error); 반품; } console.log(`서버가 http://${HOST}:${PORT} ...에서 수신 중입니다.`); })
결과는 다음과 같습니다.
pdf 파일을 반환한다는 개념은 이전에 html
파일을 반환하는 것과 비슷합니다. 둘 다 응답 헤더의 MIME
유형을 설정하고, 파일을 읽고, 파일 내용을 반환하는 과정입니다. 우리의 생각은 서버가 실행되는 동안 이를 수행하는 것입니다. pdf
파일을 생성하고 pdf
하려면 MIME
유형을 application/pdf
pdfkit
사용해야 합니다.
pnpm i pdfkit.pdf
파일을 만들려면 몇 가지 쓰기 작업을 수행해야 하기 때문에 먼저 pdf
파일을 만드는 함수를 작성합니다. 언제 완료될지는 확실하지 않지만 요청은 pdf
pdf
이 생성될 때까지 기다려야 합니다. 응답을 받으려면 이를 비동기식으로 만들고 promise
를 반환해야 합니다.
/** * @description PDF 파일 생성 */const createPdf = () => { return new Promise((해결, 거부) => { if (!fs.existsSync("example.pdf")) { // PDFDocument 객체 생성 const doc = 새 PDFDocument(); // PDF 콘텐츠를 파이핑하여 쓰기 스트림을 생성합니다. doc.pipe(fs.createWriteStream("example.pdf")); // pdf 문서에 내용을 추가합니다. doc.fontSize(16).text("안녕하세요 PDF", 100, 100); // PDF 파일 생성 작업을 완료합니다. doc.end(); } 해결("성공"); }); };
여기서 파이프라인 작업은 PDFDocument
개체의 내용을 파이프라인을 통해 새로 생성된 쓰기 스트림으로 전송하는 데 사용됩니다. 작업이 완료되면 pdf
파일이 resovle
되었음을 외부 세계에 알리고
const를호출합니다.
서버 코드의 서버 = createServer(async (req, resp) => { // MIME 유형을 application/pdf로 변경합니다. resp.writeHead(200, { "Content-Type": "application/pdf" }); //PDF 파일 생성 createPdf()를 기다립니다; // 생성된 PDF 파일 읽기 fs.readFile("example.pdf", (err, data) => { 만약 (오류) { 콘솔.오류( "pdf 파일 내용을 읽는 동안 오류가 발생했습니다: ", 실수 ); 실수를 던져; } console.log("작업 성공!"); resp.end(데이터); }); }); server.listen(PORT, HOST, (오류) => { if (오류) { console.log("뭔가 잘못되었습니다: ", error); 반품; } console.log(`서버가 http://${HOST}:${PORT} ...에서 수신 중입니다.`); })
이제 브라우저는 생성된 pdf
파일을 읽을 수 있습니다.
여전히 동일합니다. 오디오 파일을 읽은 다음 파이프라인을 통해 resp
개체로 보내고 반환합니다.
const { createServer } = require("http"); const { stat, createReadStream } = require("fs"); const HOST = "로컬호스트"; const 포트 = 8080; const 서버 = createServer((req, resp) => { // MIME 유형을 audio/mpe로 변경합니다. resp.writeHead(200, { "Content-Type": "audio/mp3" }); const mp3FileName = "audio.mp3"; stat(mp3파일 이름, (err, stats) => { if (stats.isFile()) { const rs = createReadStream(mp3FileName); // 읽기 스트림을 resp로 파이프합니다. rs.파이프(resp); } 또 다른 { resp.end("mp3 파일이 존재하지 않습니다."); } }); }); server.listen(PORT, HOST, (오류) => { if (오류) { console.log("뭔가 잘못되었습니다: ", error); 반품; } console.log(`서버가 http://${HOST}:${PORT} ...에서 수신 중입니다.`); })
효과는 다음과 같습니다.
열면 오디오 재생을 위한 인터페이스가 있습니다. 이는 chrome
에서 제공하는 오디오 파일의 표시입니다. 콘솔을 열면 반환된 오디오 파일이 있는 것을 확인할 수 있습니다.
참고: 오디오 파일 스트림을 파이프를 통해 **resp**
에 전달한 후에 **resp.end()**
메서드를 호출할 필요가 없습니다 . 이렇게 하면 전체 응답이 닫히고 오디오 파일이 종료되기 때문입니다. 없는.
MIME
유형을 video/mp4
로 변경해야 한다는 점을 제외하면 비디오 파일과 오디오 파일의 처리는 동일합니다.
const { createServer } = require("http"); const { stat, createReadStream } = require("fs"); const HOST = "로컬호스트"; const 포트 = 8080; const 서버 = createServer((req, resp) => { // MIME 유형을 audio/mpe로 변경합니다. resp.writeHead(200, { "Content-Type": "audio/mp4" }); const mp4FileName = "video.mp4"; stat(mp4파일 이름, (err, stats) => { if (stats.isFile()) { const rs = createReadStream(mp4FileName); // 읽기 스트림을 resp로 파이프합니다. rs.파이프(resp); } 또 다른 { resp.end("mp4 파일이 존재하지 않습니다."); } }); }); server.listen(PORT, HOST, (오류) => { if (오류) { console.log("뭔가 잘못되었습니다: ", error); 반품; } console.log(`서버가 http://${HOST}:${PORT} ...에서 수신 중입니다.`); });
Node
Node
사용하여 http
서버를 만들고js
에 유형 힌트를 추가하는html
pdf
파일을 생성하고 반환하는 방법JSON
내용은 간단하지만, 보기만 한다고 쉽다고 생각하지 말고 꼭 따라해보시길 바랍니다. 실제로 구현한 후에야 자신의 문제를 발견할 수 있다는 의미는 아닙니다.