什么是Express.js
Express 是一个简洁而灵活的 node.js Web应用框架, 提供一系列强大特性帮助你创建各种Web应用,提供丰富的HTTP工具以及来自Connect框架的中间件随取随用,创建强健、友好的API变得快速又简单,Express 不对 node.js 已有的特性进行二次抽象,只是在它之上扩展了Web应用所需的功能。
开篇,这里就只做简单的介绍,整理一些有关express.js的资源,与大家一起学习
Express.js中文社区:http://expressjs.jser.us/
Express.js 中文入门指引手册:http://my.oschina.net/youdoce/blog/68476
Nodejs开发框架Express3.0开发手记–从零开始:http://blog.fens.me/nodejs-express3/
Expressjs中文平台:http://www.expressjs.com.cn/
Node.js 入门: https://cnodejs.org/getstart
csdn中博文expressjs教程:http://blog.csdn.net/chszs/article/details/8869655
Node.js开发框架Express4.x:http://blog.fens.me/nodejs-express4/
记住我们用node+express+bowser,是bower 进行下载依赖js需要先安装好git。
express启动文件,app.js:
// 加载依赖库,原来这个类库都封装在connect中,现在需地注单独加载 var express = require('express'); var path = require('path'); var favicon = require('serve-favicon'); var logger = require('morgan'); var cookieParser = require('cookie-parser'); var bodyParser = require('body-parser'); // 加载路由控制 var routes = require('./routes/index'); //var users = require('./routes/users'); // 创建项目实例 var app = express(); // 定义EJS模板引擎和模板文件位置,也可以使用jade或其他模型引擎 app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); // 定义icon图标 app.use(favicon(__dirname + '/public/favicon.ico')); // 定义日志和输出级别 app.use(logger('dev')); // 定义数据解析器 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: false })); // 定义cookie解析器 app.use(cookieParser()); // 定义静态文件目录 app.use(express.static(path.join(__dirname, 'public'))); // 匹配路径和路由 app.use('/', routes); //app.use('/users', users); // 404错误处理 app.use(function(req, res, next) { var err = new Error('Not Found'); err.status = 404; next(err); }); // 开发环境,500错误处理和错误堆栈跟踪 if (app.get('env') === 'development') { app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: err }); }); } // 生产环境,500错误处理 app.use(function(err, req, res, next) { res.status(err.status || 500); res.render('error', { message: err.message, error: {} }); }); // 输出模型app module.exports = app;
项目启动代码也被移到./bin/www的文件,www文件也是一个node的脚本,用于分离配置和启动程序,源码:
#!/usr/bin/env node /** * 依赖加载 */ var app = require('../app'); var debug = require('debug')('nodejs-demo:server'); var http = require('http'); /** * 定义启动端口 */ var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * 创建HTTP服务器实例 */ var server = http.createServer(app); /** * 启动网络服务监听端口 */ server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * 端口标准化函数 */ function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { return val; } if (port >= 0) { return port; } return false; } /** * HTTP异常事件处理函数 */ function onError(error) { if (error.syscall !== 'listen') { throw error; } var bind = typeof port === 'string' ? 'Pipe ' + port : 'Port ' + port // handle specific listen errors with friendly messages switch (error.code) { case 'EACCES': console.error(bind + ' requires elevated privileges'); process.exit(1); break; case 'EADDRINUSE': console.error(bind + ' is already in use'); process.exit(1); break; default: throw error; } } /** * 事件绑定函数 */ function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); }
写烂了的node例子:
var http = require("http"), open = require("child_process"); console.log("启动httpserver服务"); var server = http.createServer(function(req,res){ res.writeHead(200,{"Content-Type":"text/html;charset=UTF-8"}); res.write("开始 "); res.end("我来了"); }); server.listen(3000,"127.0.0.1"); open.exec("start http://127.0.0.1:3000"); console.log("3000端口。")
var net = require("net"), open = require("child_process"); console.log("启动httpserver服务"); var server = net.createServer(function(req,res){ //设置请求编码 socket.write("Echo server "); })
node 项目经常需要安装的模块在项目根目录进行安装:
npm install express npm install jade npm install mongoose npm install bower -g bower install bootstrap