node的实践(项目一)
学习一门语言,我们先要学习他的基本的语法,基本的数据类型,基本的数组操作,字符串的操作,然后就是语言的特性,实现共享和降低耦合的方式,然后开始比较高级的学习(所有语言都是一样的),比如说通信方法,tcp http等,io的操作,多进程,多线程的通信方式,阻塞非阻塞,对数据库的操作,性能的提升和更好的设计模式架构等。
当然对于一些tomcat,nginx,pm2,对服务器和一些服务器相关的工具的熟练使用,可能比上面的基础还要重要。
我们学习Node这门服务端的语言,同样。学习他后台的框架 express和koa还有基于express的hapi等,了解他的更多的核心包,还有很多基于Node开发的前端Mvc的框架等,尝试使用,毕竟一个公司通常用的东西都是成熟稳定的东西,新的东西风险太大。
尝试用前后端分离的mokjs,framejs,以前前端模块化的一些东西等。
对前端优化的工具gulp等有比较好的使用。
我们对node的学习,对基本库的使用,对数据库的操作,对前台的数据返回,对session,cookie等的设置,与前台的数据交互方式,对于文件的上传,读写等。
不断的积累源码,不断的提升自己。
******************************************************
node的核心包:
******************************************************
1. 问题:如何遍历配置中的包,确定所有的都加载了。
//检查下依赖的模块是否都已安装
(function() {
var errors = [];
var packages = require('../package.json');
Object.keys(packages.dependencies).forEach(function (p) {
try {
require.resolve(p);
} catch (e) {
errors.push(e.message);
}
}); if (!errors.length) {
return;
}
errors = errors.join('\n ');
console.error('\x1B[31mERROR: creative platform is unable to start due to missing dependencies:\x1B[0m\n ' + errors);
console.error('\x1B[32m\nPlease run `npm install` and try starting creative platform again.');
console.error('\x1B[32mHelp and documentation can be found at http://wiki.letv.cn/pages/viewpage.action?pageId=46202060\x1B[0m\n');
process.exit();
}());
后面的console.error中的 \x1B[31m 表示字体的颜色和字体的大小。
2.node中的绝对路径怎么搞:__dirname
在任何模块文件内部,可以使用__dirname变量获取当前模块文件所在目录的完整绝对路径
3.path.resolve方法的使用。http://www.jb51.net/article/58295.htm
contentPath = path.resolve(__dirname, '../../content');
4.require的方法的使用。http://www.ruanyifeng.com/blog/2015/05/require.html
5.检查某些目录是否存在。
对Promise的使用。
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/resolve
//检查下content目录是否存在
var checkContent = new Promise(function(resolve, reject) {
var stats;
try {
//服务器启动前,可执行同步io
stats = fs.statSync(appConfig.contentPath);
} catch (e) {
if (e.code == 'ENOENT') {
return resolve(false);
} else {
return reject(e);
}
}
if (stats.isDirectory()) {
return resolve(true);
} else {
return reject(new Error(appConfig.contentPath + ' is not a directory'));
}
});
Promise.resolve(checkContent).then(function(exist) {
var promise;
if (!exist) {
//没有content目录时,在开发模式下,才会创建
if (appConfig.mode === appConfig.DEVELOPMENT) {
var ncpAsync = Promise.promisify(ncp);
promise = ncpAsync(appConfig.contentExamplePath, appConfig.contentPath);
} else {
promise = Promise.reject(new Error('Cannot find directory ' + appConfig.contentPath));
}
} else {
promise = Promise.resolve();
}
return promise;
}).then(function() {
//检查下服务器上是否有flash的编译器
return new Promise(function(resolve, reject) {
var stats;
try {
//服务器启动前,可执行同步io
stats = fs.statSync(path.join(appConfig.env.flexSDKPath, 'bin'));
} catch(e) {
return reject(e);
}
if (!stats.isDirectory()) {
return reject(new Error('Cannot found flex sdk'));
}
return resolve();
});
}).then
6. process模块 http://www.css88.com/archives/4548
7. 一个比较完整的express的配置
var app = express();
var rootPath = process.cwd(); var server = {
startup: function() {
return new Promise(function(resolve, reject) {
app.set('views', path.join(rootPath, 'views'));
app.set('view engine', 'ejs'); if (appConfig.mode !== appConfig.DEVELOPMENT) {
app.set('trust proxy', );
} app.use(favicon(path.join(rootPath, 'public/images/favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser()); var options = {
resave : true,
saveUninitialized : true,
secret : appConfig.env.sessionSecret,
rolling : true,
cookie : {
maxAge : appConfig.env.sessionMaxAge
}
}; if (appConfig.mode !== appConfig.DEVELOPMENT) {
//将session写到redis中
options.store = new RedisStore( {retry_max_delay: , max_attempts: } );
} //flashSession用来修复flash上传组件上传文件时丢失cookie的bug
app.use(flashSession());
app.use(session(options)); if (appConfig.mode === appConfig.DEVELOPMENT) {
//显示静态资源列表(只显示public目录下的,并不是所有的)
app.use('/static', serveIndex(path.join(rootPath, 'public'), {
icons : true,
hidden : true,
view : 'details'
}));
} app.use(express.static(path.join(rootPath, 'public'))); //编译生成的swf文件及上传的文件的静态资源目录
app.use(express.static(appConfig.staticDir.assetsPath)); app.use(express.static(appConfig.staticDir.apsPath)); //刊例和素材规范的静态资源目录
app.use(express.static(appConfig.staticDir.ratecardPath)); //刊例和素材规范相关的图片, js, 样式
app.use('/rc', express.static(path.join(rootPath, 'public'))); //controller作为中央控制器,集中管理路由
controller.route(app); app.listen(appConfig.env.port, '0.0.0.0', , function(err) {
console.log('\n');
console.log(' fttt8 GCCCG C1t10 ');
console.log(' fttt8 0f11111tG 0CCftttLCLG 0GL0 8CCL0 ');
console.log(' fttt8 0tttC00Gf10 C11tttt1110 LC1L G1t1G ');
console.log(' fttt8 fttG GtfG CCftttLCC0G G1f Cttt8 ');
console.log(' fttt8 0ttf 8GLttt0 L1t10 0tt8 fttf ');
console.log(' fttt8 CttfCft11fC8 L1t10 8f1G 0tttL ');
console.log(' fttt8 C1tt11fL08 L1t10 L1L Gttt0 ');
console.log(' fttt8 GtttL08 8 L1t10 C1f Lttt8 ');
console.log(' fttt8 8tttG C0 L1t10 0ttLtttL ');
console.log(' ftttG00008 C1ttC8 80fL LtttC00 8ttttttG ');
console.log(' fttttttt1f L1tttft1f8 L1ttttt0 L1tttt8 ');
console.log(' LtfffffftL GfttttC Gtfffff0 GtfftL ');
console.log(' 800 ');
console.log(' ');
console.log(' Creative platform ' + pack.version );
console.log(' ');
console.log(' Server running at ' + appConfig.env.httpServerURL );
console.log('');
console.log('\x1B[32m\nHelp and documentation can be found at http://wiki.letv.cn/pages/viewpage.action?pageId=46202060\x1B[0m\n');
return resolve();
});
});
}
}; module.exports = server;
6.
var appConfig = require('../config/app_config');
var ErrorCode = require('../models/error_code'); function Controller() {} /**
* 集中管理路由
* @method route
* @for Controller
* @param {Function} app 应用程序
*/
Controller.prototype.route = function(app) {
var check_login_cmd = require('../commands/auth/check_login_cmd');
var check_logout_cmd = require('../commands/auth/check_logout_cmd');
var index_cmd = require('../commands/index_cmd');
var login_cmd = require('../commands/login_cmd'); var creative = require('../commands/creative'); //广告创意
var user = require('../commands/user'); //用户
var admin = require('../commands/admin');
var ratecard = require('../commands/ratecard'); //刊例
var post = require('../commands/post'); //发表文章
var spec = require('../commands/spec'); //素材规范
var ueditor = require('../commands/ueditor'); //百度编辑器
var openapi = require('../commands/openapi'); //开放平台 this.app = app; app.route('/').get(check_login_cmd('html'), index_cmd);
app.route('/login').get(check_logout_cmd('html'), login_cmd); //将/creative/下的请求都交给creative,即交给creative目录下的index.js
//来处理,index.js控制二级路由,/user, /ratecard等以此类推
app.use('/creative', creative);
app.use('/user', user);
app.use('/admin', admin);
app.use('/ratecard', ratecard);
app.use('/post', post);
app.use('/spec', spec);
app.use('/ueditor', ueditor);
app.use('/openapi', openapi); //
app.use(function(req, res, next) {
res.status();
res.render('', {
message: req.url + ' not found'
});
}); //服务器错误
app.use(function(err, req, res, next) {
res.status(err.status || );
res.render('error', {
error: appConfig.mode == appConfig.PRODUCTION ? {stack: ''} : err
});
});
}; Controller.prototype.responseJson = function(res, data, msg, errCode) {
if(errCode === true) {
errCode = ErrorCode.ERROR;
}else if(errCode === false) {
errCode = ErrorCode.SUCCESS;
}
var jsonData = {};
jsonData.data = data;
jsonData.msg = msg,
jsonData.error = errCode;
var head = {
'Content-Type': 'application/json',
};
res.writeHead(, head);
res.end(JSON.stringify(jsonData));
}; Controller.prototype.responseJsonObj = function(res, data) {
var head = {
'Content-Type': 'application/json',
};
res.writeHead(, head);
res.end(JSON.stringify(data));
}; Controller.prototype.responseTxt = function(res, txt) {
res.end(txt);
}; Controller.prototype.response404 = function() {
res.status();
res.render('', {
message: req.url + ' not found...'
});
}; Controller.prototype.responseHtml = function() {
var res, options, path, data;
if(arguments.length == ) {
res = arguments[];
options = arguments[];
path = arguments[];
data = arguments[];
}else if(arguments.length == ) {
res = arguments[];
path = arguments[];
data = arguments[];
}else if(arguments.length == ) {
res = arguments[];
path = arguments[];
}
if(!options) {
options = {};
}
if(options.noCache) {
res.setHeader('Cache-Control', 'no-cache');
res.setHeader('Pragma', 'no-cache');
}
if(options.viewsPath) {
var app = this.app;
var viewsPath = app.get('views');
app.set('views', options.viewsPath);
res.render(path, data || {});
app.set('views', viewsPath);
}else {
res.render(path, data || {});
}
}; Controller.prototype.responseFile = function(res, statusCode, head, file) {
res.writeHead(statusCode, head);
res.write(file, "binary");
res.end();
}; Controller.prototype.redirect = function(res, path) {
res.redirect(path);
}; var controller = new Controller();
module.exports = controller;
node的实践(项目一)的更多相关文章
- 8 步搭建 Node.js + MongoDB 项目的自动化持续集成
任何事情超过 90 秒就应该自动化,这是程序员的终极打开方式.Automating shapes smarter future. 这篇文章中,我们通过创建一个 Node.js + MongoDB 项目 ...
- React 实践项目 (二)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- python编程快速上手之第10章实践项目参考答案
本章主要讲了python程序的调试,当程序有BUG或异常的时候,我们如何调试代码找出问题点.其实在本章之前的章节我们做练习的时候都会遇到各种各样的错语和异常,最初当不知道程序哪里出错的情况下不可否 ...
- python编程快速上手之第9章实践项目参考答案
本章介介绍了shutil,zipfile模块的使用,我们先来认识一下这2个模块吧. 一.shutil模块 shutil模块主要用于对文件或文件夹进行处理,包括:复制,移动,改名和删除文件,在shuti ...
- python编程快速上手之第8章实践项目参考答案
第8章实践项目之疯狂填词 创建一个一个疯狂填词(Mad Libs),程序,它将读入文本文件,并让用户在该文本文件中出现 ADJECTIVE,NOUN,VERB等单词的地方,加上他们自己的文本. 首先准 ...
- React 实践项目 (三)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! 上回说到使用Redux进行 ...
- React 实践项目 (五)
React在Github上已经有接近70000的 star 数了,是目前最热门的前端框架.而我学习React也有一段时间了,现在就开始用 React+Redux 进行实战! React 实践项目 (一 ...
- iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
安装搭建项目的开发环境 视频地址:https://www.cctalk.com/v/15114357764004 文章 Koa 起手 - 环境准备 由于 koa2 已经开始使用 async/await ...
- 关于Prometheus运维实践项目
关于Promethues运维实践项目 1. 什么是Prometheus运维实践项目 是什么 Prometheus,普罗米修斯,是古希腊神话中为人间带来火种的神. Prometheus运维实 ...
- 《Java 程序设计》课堂实践项目 课后学习总结
<Java 程序设计>课堂实践项目 课后学习总结 String类的使用(sort) 目录 Linux命令(sort) 课堂实践 课后思考 学习老师的代码之后的思考:int与Integer ...
随机推荐
- 基于注解配置的Spring MVC 简单的HelloWorld实例应用
2.1 问题 使用注解的方式重构helloworld应用案例. 2.2 方案 1. @RequestMapping注解应用 @RequestMapping可以用在类定义和方法定义上,它标明这个类或方法 ...
- C语言流程控制
顺序结构 顺序结构是最常用的结构,即从上到下的执行语句. int num=5; num++; num=13; 条件结构 条件结构是当表达式为真的时候执行语句块,C语言提供了两种条件结构 if...el ...
- ASP.NET中iframe框架点击左边页面链接,右边显示链接页面内容
首先是主页面main.aspx <body style="background-color: #AFEEEE"> <form id="form1&quo ...
- Hibernate占位符?和:及JPA
小结一下hibernate占位符. 1.最常见的?占位符. String hql = "select a from Apple a where a.color=? a.weight>? ...
- 初识selenium-grid
什么是selenium-grid,官方解释:takes Selenium Remote Control to another level by running tests on many server ...
- 【软件使用】Windows下的Objective-C集成开发环境搭建(IDE)
Objective-C是苹果软件的编程语言,想要上机学习.调试,有一个集成开发环境(IDE)方便很多.有三类方法搭建Objective-C的集成开发环境: 1) 使用苹果的平台,集成开发环境使用X ...
- hdu 1028 Ignatius and the Princess III 简单dp
题目链接:hdu 1028 Ignatius and the Princess III 题意:对于给定的n,问有多少种组成方式 思路:dp[i][j],i表示要求的数,j表示组成i的最大值,最后答案是 ...
- UVA 11766 Racing Car Computer --DP
题意:电脑记录了某一时刻每个赛车的前面和后面个有多少辆车(多个车并排时在别的车那只算一辆),问最少有多少个不合理的数据. 分析:看到n<=1000时,就尽量往DP上想吧. 每输入一组数据a,b, ...
- UVA 11573 Ocean Currents --BFS+优先队列
采用优先队列做BFS搜索,d[][]数组记录当前点到源点的距离,每次出队时选此时eng最小的出队,能保证最先到达的是eng最小的.而且后来用普通队列试了一下,超时..所以,能用优先队列的,就要用优先队 ...
- MyBatis学习总结(一)
一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.MyBatis可以 ...