IncomingForm.prototype.parse = function(req, cb) {
this.pause = function() {
try {
req.pause();
} catch (err) {
// 스트림이 파괴되었습니다
if (!this.ended) {
// 완료되기 전에 충돌 및 소각
this._error(err );
}
false를 반환합니다.
}
true를 반환합니다.
};
this.resume = function() {
try {
req.resume();
} catch (err) {
// 스트림이 파괴되었습니다
if (!this.ended) {
// 완료되기 전에 충돌 및 소각
this._error(err );
}
false를 반환합니다.
}
true를 반환합니다.
};
this.writeHeaders(req.headers);
var self = this;
req
.on('error', function(err) {
self._error(err);
})
.on('aborted', function() {
self.emit('aborted');
})
.on('data', function(buffer) {
self.write(buffer);
})
.on ('end', function() {
if (self.error) {
return;
}
var err = self._parser.end();
if (err) {
self._error(err)
}
});
if (cb) {
var fields = {}, files = {};
이
.on('필드', 함수(이름, 값) {
필드[이름] = 값;
})
.on('파일', 함수(이름, file) {
files[이름] = file;
})
.on('error', function(err) {
cb(err, fields, files);
})
.on('end', function() {
cb(null, 필드, 파일);
});
}
이것을 반환하세요.
};
parse中,将head信息解析流来这段是阻塞的。但是真正上传文件却是현재req.on(data)中,是利用了事件驱动,是不阻정말 좋아요.就是说,他的不阻塞模型依赖整个nodeJS事件分派架构。
那么imagesleep那样消耗大weight计算,但是又不能依赖nodeJS分派架构的时候怎么办?
现에서 介绍一种,类似于html5 WebWorker 적법.
将requestHandler.js改造如下:
var childProcess = require("child_process");
exports.hello = function(res) {
var n = childProcess.fork(__dirname "/subProcess.js");
n.on('message', function() {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write("안녕하세요. ");
res.end();
});
n.send({});
};
exports.upload = function(res) {
res.writeHead(200, {"Content-Type": "text/plain"});
res.write("업로드");
res.end();
};
并加入subProcess.js
function sleep(milliSecond) {
var startTime = new Date().getTime();
console.log(startTime);
while(new Date().getTime() <= milliSecond startTime) {
}
console.log(new Date().getTime());
}
process.on('message', function() {
sleep(20000);
process.send({});
});
测试,当hello还에서 업로드하세요. twitter.comNodeJS是异步的입니다.但是是何种程道는 异步,这个概念就没有几篇文章讲对了。
NodeJS,他是一个双层的架构。C 。并且是单线程的。这点尤其Node其实是C는 v8调用js命令,为了实现调用顺序维护了一个Event序列。因此,一个js function内部,他的调用绝对会对其他의 기능은 产生阻塞입니다. nextTick과 setTimeout은 새로운 기능을 제공하지 않으며, 더 이상 이벤트가 발생하지 않습니다.要简单的多,直接加入Event序列顶层(有个啥啥事件) . 而setTimeout이 io에 의해 결정된 콜백 이벤트에 따라 결정되었습니다.数,第二个参数是一个콜백.那么node中第一件事就是记录下callback到了c ,而不是js这块。所以,exec到callback은 http.createServer到触发callback을 사용하여 为止是异步的입니다.命令,相信这个过程速島不常快。然后等待回调的过程Node用c 隐藏了,他也是异步的。
而我这篇文章想说明的是,如果再js端有花费大时间多运算怎么办.就用我上所说的방법 ,이용 js 打开c 적 线程, 这 个 subprocess.js , 不 in node 의 event序列 内 护 。 是 새로운 线程 , 因此 不会阻塞其他 的 js function