Node 技术栈实践
张宇⾠辰 (pw) @ 猿题库
后端
前端 ?
Java/Python/PHP …
HTML/CSS/JavaScript…
猿题库前端进化之路
Node 实践中的那些坑
后端
前端 ?
Java/Python/PHP …
HTML/CSS/JavaScript…
服务器 数据库浏览器 模板 静态资源
服务器 数据库浏览器 模板 静态资源
后端 前端
服务器 数据库浏览器 模板 静态资源
后端 前端
服务器 数据库浏览器 模板 静态资源
后端 前端灰⾊色地带
服务器 数据库 模板
后端 前端
⽤用接⼝口来解决问题
服务器 数据库 模板
后端 前端
前端包圆
猿题库前端进化之路
CSS / JS / IMG
Java
HTML Template
猿题库
CSS /
JS / IMG
Java
HTML
Tmpl
主站
CSS /
JS / IMG
Java
HTML
Tmpl
公务员
CSS /
JS / IMG
Java
HTML
Tmpl
司法考试
CSS /
JS / IMG
Java
HTML
Tmpl
⾼高考
Java
主站
CSS /
JS / IMG
Java
HTML
Tmpl
公务员
Java
司法考试
Java
⾼高考
前端代码
Java
主站
CSS /
JS / IMG
Java
HTML
Tmpl
公务员
Java
司法考试
Java
⾼高考
前端服务器
Node
Java
主站
CSS /
JS / IMG
Java
HTML
Tmpl
公务员
Java
司法考试
Java
⾼高考
前端服务器
Node
后端
前端
HTTP
服务器 数据库 模板
后端 前端
前端包圆 (By Node)
那些坑
• HTTP
• 异常处理
• 内存泄露
• 多核优化, 部署
• ⼀一些⼯工具: 开发, 调试, 性能调优
n
2n
2n
n
client api request
Node API ServerNginx
Node API ServerNginx
n
2n
2n
n
Nginx
client api request
NginxNode
API Server API Server API Server
Nginx
10.0.1.3 yuantiku.com
/api
/
http.globalAgent.maxSockets = Infinity;
var agent = new http.Agent({
maxSockets: 2
});
!
req.request = request.defaults({
pool: agent
});
那些坑
• HTTP
• 异常处理
• 内存泄露
• 多核优化, 部署
• ⼀一些⼯工具: 开发, 调试, 性能调优
app.get('/foo', function (req, res) {
throw new Error('foo');
});
!
app.use(function (err, req, res, next) {
res.send(500, err.message);
});
app.get('/bar', function (req, res) {
process.nextTick(function () {
throw new Error(‘bar'); // 异步函数中的异常
});
});
process.on('uncaughtException', function () {
return;
});
Express
Domain
http://lostjs.com/2014/01/25/handle-exception-in-node/
那些坑
• HTTP
• 异常处理
• 内存泄露
• 多核优化, 部署
• ⼀一些⼯工具: 开发, 调试, 性能调优
var val = 'hello world';
function outer() {
var val = 'bar';
return function inner() {
return val;
};
}
global.inner = outer();
var getUserData = (function () {
var cache = {};
return function (userId, callback) {
if (cache[id]) {
process.nextTick(function () {
callback(cache[id]);
});
return;
}
getUser(id, function (data) {
cache[id] = data;
callback(data);
});
};
}());
var getUserData = (function () {
var cache = new LRU({max: 100});
return function (userId, callback) {
if (cache.has(id)) {
var user = cache.get(‘id’);
process.nextTick(function () {
callback(user);
});
return;
}
getUser(id, function (data) {
cache.set(id, data);
callback(data);
});
};
}());
app.get(‘/users/:id’, function (req, res) {
getUser(function (req.param(‘id’), data) {
user = data;
getOrderByUser(user.id, function (order) {
res.render({
user: user,
order: order
});
});
});

});
app.get(‘/users/:id’, function (req, res) {
getUser(function (req.param(‘id’), data) {
user = data;
getOrderByUser(user.id, function (order) {
res.render({
user: user,
order: order
});
});
});

});
app.get(‘/users/:id’, function (req, res) {
getUser(function (req.param(‘id’), data) {
var user = data;
getOrderByUser(user.id, function (order) {
res.render({
user: user,
order: order
});
});
});

});
app.get(‘/users/:id’, function (req, res) {
getUser(function (req.param(‘id’), data) {
var user = data;
getOrderByUser(user.id, function (order) {
res.render({
user: user,
order: order
});
});
});

});
‘use strict’;
那些坑
• HTTP
• 异常处理
• 内存泄露
• 多核优化, 部署
• ⼀一些⼯工具: 开发, 调试, 性能调优
• node
• pm2
• NODE_ENV
那些坑
• HTTP
• 异常处理
• 内存泄露
• 多核优化, 部署
• ⼀一些⼯工具: 开发, 调试, 性能调优
• npm
• node inspector
• webkit-devtools-agent
• console.trace
perfectworks@gmail.com	
@__pw__	
lostjs.com

Node way