1. 개방 분석
파일 시스템 모듈은 표준 POSIX 파일 I/O 작동 방법의 간단한 패키지 세트입니다. 모듈은 요구 사항 ( "FS")을 호출하여 얻을 수 있습니다. 파일 시스템 모듈의 모든 방법은 비동기 및 동기 버전으로 제공됩니다.
(1) 파일 시스템 모듈의 비동기 방법은 마지막 수신 공식 매개 변수로서 완성 된 콜백 함수가 필요합니다.
(2) 콜백 함수의 구성은 호출 된 비동기 방법에 의해 결정된다. 일반적으로 콜백 함수의 첫 번째 공식 매개 변수는 반환 된 오류 메시지입니다.
(3) 비동기 조작이 올바르게 실행되고 반환되면 오류 공식 매개 변수는 널 또는 정의되지 않았습니다. 동기 버전의 작업 메소드를 사용하는 경우 오류가 발생하면 일반적인 형태의 오류를 던지는 오류가 반환됩니다.
(4) Try and Catch 문을 사용하여 오류를 가로 채고 프로그램을 계속할 수 있습니다.
먼저 간단한 예를 살펴보고 파일을 읽으십시오 ( "bb.txt") :
(1) 다음과 같이 "bb.txt"파일을 만듭니다 ( "안녕하세요, 나는 nobita입니다! (*^__^*) hehe ...").
(2), 다음과 같이 파일 작동을 읽으십시오.
코드 사본은 다음과 같습니다.
var fs = 요구 ( "fs");
fs.readfile ( "bb.txt", "utf8", 함수 (오류, 데이터) {
if (오류) 던지기 오류;
Console.log (데이터);
});
실행 결과 :
여기에 주목해야 할 것은 파일을 읽을 때 인코딩을 설정해야합니다. 그렇지 않으면 기본 양식이 "버퍼"에 나타납니다.
설정되지 않은 실행 효과를 살펴보면 차이가 여전히 분명합니다. 다음과 같이 :
다음과 같이 다른 쓰기 작업 :
코드 사본은 다음과 같습니다.
var fs = 요구 ( "fs");
var txt = "모두가 nodejs를 배워야합니다 !!!" ;
// 파일에 씁니다
fs.writefile ( "bb.txt", txt, function (err) {
(err)를 던지면;
Console.log ( "파일 저장!"); // 파일이 저장됩니다
});
실행 결과 :
다음은 몇 가지 일반적인 예입니다.
코드 사본은 다음과 같습니다.
// 파일을 삭제합니다
fs.unlink ( 'bb.txt', function () {
Console.log ( '성공');
});
// 파일 이름을 수정합니다
fs.rename ( 'bb.txt', 'bigbear.txt', function (err) {
Console.log ( '성공 이름 바꾸기');
});
// 파일 상태를 확인합니다
fs.stat ( 'bb.txt', function (err, stat) {
Console.log (STAT);
});
// 파일이 존재하는지 확인합니다
fs.exists ( 'bb.txt', function (Exists) {
Console.log (존재);
});
2. FS와 스트림의 연결
"스트림"에는 비동기식 기능이 있습니다. 파일이나 콘텐츠를 알 수없는 "청크"로 나누고 읽을 수 있습니까? "청크"를 읽을 때마다 출력합니다. 파일이 완료 될 때까지. 이것은 "http1.1"에 의해 뒷받침되는 "전송 인코딩 : 청크"와 같습니다. ( "청크"는 어떤 형태로든 존재할 수 있으며, Nodejs는 기본적으로 "버퍼"형태로 존재하며, 이는 더 효율적입니다). Nodejs의 "Stream"에는 UNIX 시스템에 대한 슈퍼 기능이 있습니다 ( "파이프"------ 파이프 라인).
여전히 첫 번째 Nodejs 프로그램 "안녕하세요, 빅 베어!"를 기억하십니까? 우리는 다음과 같이 애플릿을 기준으로 약간의 수정을합니다.
(1), "bb.html"생성
코드 사본은 다음과 같습니다.
<html>
<헤드>
<스타일 유형 = "텍스트/CSS">
div {
마진 탑 : 50px;
너비 : 100%;
여백 : 0px;
높이 : 120px;
라인 높이 : 120px;
색상 : #ffff;
글꼴 크기 : 22px;
배경 :#FF9900;
텍스트 정렬 : 센터;
}
</스타일>
</head>
<body>
<div> 안녕하세요, 빅 베어! </div>
</body>
</html>
(2), 이전 프로그램을 다음과 같이 수정하십시오.
코드 사본은 다음과 같습니다.
var http = 요구 ( 'http');
var fs = 요구 ( "fs");
var server = http.createserver (function (req, res) {
fs.readfile ( "bb.html", "utf-8", function (err, data) {
if (err) {
res.writehead (500, { 'context-type': 'text/plain'});
res.end ( '파일이 존재하지 않음! 또는 서버 오류!');
}
또 다른{
res.writehead (200, { 'context-type': 'text/html'});
res.write (데이터);
res.end ();
}
})
});
Server.Listen (8888);
Console.log ( "포트 8888에서 실행되는 HTTP 서버 ...");
다음은 실행 결과입니다.
이제 간단한 텍스트 파일이 아니라 Google 2014 IO Conference의 전체 HD 비디오 파일과 같은 하이퍼 미디어 파일을 보내는 경우 생각해야합니다. MP4 형식. 길이는 2 시간 이상 1080p입니다.
약 4GB. "readfile"이 작동하는 것으로 알려진 방식은 파일을 메모리로 읽는 것입니다. 그런 다음 큰 파일은 분명히 수행 할 수 없습니다. 그래서 어떻게해야합니까? 그런 다음 스트림을 사용하여 수행해야합니다. 그래서 그게 다야.
코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
fs.createreadstream (__ dirname + '/vedio.mp4 ').pipe(res);
요약하려면 :
이 코드는 필수 기능을 구현할 수 있지만 "bb.html"파일이 매우이면 파일 데이터를 보내기 전에 전체 파일 데이터를 메모리로 캐시해야합니다.
그것이 크고 동시성이 크면 많은 기억이 낭비됩니다. 사용자는 파일 데이터를 수락하기 위해 전체 파일이 메모리로 캐시 될 때까지 기다려야하므로
사용자 경험은 상당히 나쁩니다. 다행스럽게도 두 매개 변수 "(req, res)"는 스트림이므로 "fs.readfile ()"대신 fs.createreadstream ()을 사용할 수 있습니다.
세 가지, 예
파일을 업로드하십시오.
(1) "server.js"생성
코드 사본은 다음과 같습니다.
var http = 요구 ( 'http');
var url = 요구 사항 ( 'url');
함수 시작 (경로, 핸들러) {
onrequest (요청, 응답) {
var pathname = url.parse (request.url) .pathname;
// 해당 비즈니스 로직으로의 경로
경로 (PathName, 핸들러, 응답, 요청);
}
http.createserver (onrequest) .listen (3000);
console.log ( '서버가 시작 중다');
}
Exports.start = 시작;
(2) "route.js"생성
코드 사본은 다음과 같습니다.
기능 경로 (PathName, 핸들러, 응답, 요청) {
Console.log ( '' + pathname에 대한 요청을 라우팅하려면);
if (typeof handler [pathname] === 'function') {
return handler [pathname] (응답, 요청);
} 또 다른 {
console.log ( '' + pathname에 대한 요청 핸들러 없음);
response.writehead (404, { 'content-type': 'text/html'});
response.write ( '404 찾기 없음!');
응답 ();
}
}
Exports.route = 경로;
(3) "requestHandler.js"생성
코드 사본은 다음과 같습니다.
var querystring = require ( 'QueryString'),
fs = 요구 ( 'fs'),
강력한 = 요구 사항 ( '포괄적 인');
함수 시작 (응답, 요청) {
Console.log ( '시작 모듈');
var body = '<html>'+
'<head>'+
'<meta http-equiv = "content-type"'+
'content = "text /html; charset = utf-8" />'+
'</head>'+
'<body>'+
'<form action = "/upload"EncType = "multipart/form-data"method = "post">'+
'<input type = "file"name = "Upload"multure = "multiple">'+
'<input type = "제출"value = "텍스트 제출" />'+
'</form>'+
'</body>'+
'</html>';
response.writehead (200, { 'content-type': 'text/html'});
응답. 쓰기 (신체);
응답 ();
}
함수 업로드 (응답, 요청) {
Console.log ( '업로드 모듈');
var form = new commidable.incomingform ();
form.parse (요청, 함수 (오류, 필드, 파일) {
fs.renamesync (files.upload.path, '/tmp/test.png');
response.writehead (200, { 'content-type': 'text/html'});
response.write ( 'you /'ve send : <br /> ');
response.write ( '<img src = " /show" />');
응답 ();
});
}
함수 쇼 (응답, 요청) {
Console.log ( 'show module');
fs.readfile ( '/tmp/test.png', 'binary', function (error, file) {
if (오류) {
response.writehead (200, { 'content-type': 'text/html'});
응답 (오류);
응답 ();
} 또 다른 {
response.writehead (200, { 'content-type': 'image/png'});
response.write (파일, '바이너리');
응답 ();
}
});
}
Exports.start = 시작;
Exports.upload = 업로드;
Exports.show = show;
(4), "index.js"생성
코드 사본은 다음과 같습니다.
var server = require ( './ server');
var router = require ( './ router');
var requestHandler = require ( './ requestHandler');
var commidable = require ( 'formidable'); // 경로 검색 알고리즘이 필요하십니까? ?
var handler = {};
핸들러 [ '/'] = requestHandler.start;
핸들러 [ '/start'] = requestHandler.start;
핸들러 [ '/upload'] = requestHandler.upload;
핸들러 [ '/show'] = requestHandler.show;
server.start (router.route, handler);
4, 요약합시다
(1) "FS와 스트림의 연결"을 이해합니다.
(2) "FS"관련 API를 사용하는 데 능숙합니다.
(3) 파일 작동 API 동기화 방법과 비동기 방법 사이의 처리 세부 사항과 같은 세부 사항에주의를 기울입니다.
(4), 마지막으로 강조 : 파일 업로드 예제에서 코드 조직 방법을 이해하고 지속적으로 리팩터링하고 지속적으로 요약합니다.