express开发框架
1.express
http://www.expressjs.com.cn/
2.什么是express
基于 Node.js 平台,快速、开放、极简的 Web 开发框架(用express构建开放框架)
3.express使用流程
1.全局安装 express-generator(一台电脑安装一次即可)
生成器工具 express-generator 可以快速创建一个应用的骨架。
npm install express-generator -g
什么是应用的骨架:
当我们开发项目的时候,需要手动创建html文件夹,css文件夹,js文件夹,common文件夹等等以便于文件的分类,
如果使用手动创建这些文件夹会比较麻烦,这是我们可以用express-generator生成器工具快速创建一个应用的构架,即自动创建好各种分类的文件夹
2.在项目根目录中
1.初始化项目 npm init -y
2.安装express模块 npm install express --save-dev 2. 生成文件(使用的ejs模板引擎)即创建了应用的骨架 express -e 3.安装依赖(系统根据package.json中的dev来安装依赖) npm install
4.可在package.json文件中修改运行node的方式
"scripts": { //yun'xingbin目录下的www文件 "start": "supervisor ./bin/www" },
运行npm run start ==== supervisor server,简化了命令书写,名字start是自己定义的
5.可在package.json设置端口号,默认的端口号为3000
"scripts": { "start": "set PORT=1111 && supervisor ./bin/www"
分析express过程
1.分析bin/www文件
//引入模块(自定义模块)(分析自定义模块app.js) var app = require('../app'); var debug = require('debug')('day4-express:server'); var http = require('http'); /** * Get port from environment and store in Express. */ //端口号 var port = normalizePort(process.env.PORT || '3000'); app.set('port', port); /** * Create HTTP server. */ //创建服务器 var server = http.createServer(app); /** * Listen on provided port, on all network interfaces. */ //设置端口号 server.listen(port); server.on('error', onError); server.on('listening', onListening); /** * Normalize a port into a number, string, or false. */ //处理端口号的类型 function normalizePort(val) { var port = parseInt(val, 10); if (isNaN(port)) { // named pipe return val; } if (port >= 0) { // port number return port; } return false; } /** * Event listener for HTTP server "error" event. */ 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; } } /** * Event listener for HTTP server "listening" event. */ //当服务器执行的时候执行的代码 function onListening() { var addr = server.address(); var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; debug('Listening on ' + bind); }
3.分析app.js自定义模块(中间件的使用必须在express实例之后,引入路由必须在express之前)
//引入模块 var createError = require('http-errors');//服务器报错模块 var express = require('express');//express模块 var path = require('path'); var cookieParser = require('cookie-parser');//cookie-parse中间件 var logger = require('morgan');//日志 //引入路由 var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); //创建express实例,中间件的使用必须在express实例之后 var app = express(); // __dirname:当前目录的绝对路径/ //path.join()路径拼接,拼接后的路径为/views app.set('views', path.join(__dirname, 'views')); //ejs模板 app.set('view engine', 'ejs'); //使用中间件,app.use()专门用来使用中间件 app.use(logger('dev'));//日志中间件 app.use(express.json());//处理json的中间件 app.use(express.urlencoded({ extended: false }));//表单提交数据中间件 app.use(cookieParser());//cookie中间件 //所有静态文件的地址(所有的静态文件放在public中) app.use(express.static(path.join(__dirname, 'public'))); //当访问跟路径/时,执行indexRouter路由 app.use('/', indexRouter); //当访问/users路径时,执行usersRouter路由 app.use('/users', usersRouter); // 当服务器的状态码为404,请求不到资源时执行的函数 app.use(function(req, res, next) { next(createError(404)); }); //当服务器500或者其他错误时执行的函数 app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;