NodeJs ·

NodeJS 记 – Express框架使用

开发一个程序就不离不开各种框架,框架的好处是让我们能更专注业务逻辑的处理,提高开发效率。但同时也有坏处,如:

  • 代码不可控,有坑不知道在哪里,更别说去填。
  • 导致项目臃肿,框架可能集合了一些我们更本不用的功能块。

并且框架种类繁多,如何选择合适,且了解比较多也是已经很费力的事情,所以在项目初期可以看出,框架的选择,技术的选择是非常重要的。自然Node程序也少不了各种框架。对各种框架的比较请访问:http://web.jobbole.com/84607/

在这我们选择用户最多,文档全,学习难点不陡峭的Express。用户多代表框架质量高,该有的坑都让别人踩了,该填的也填了。文档全代表我们学习它更容易上手。关于Express的介绍请访问:http://www.expressjs.com.cn/

首先我们先不用Express创建一个Server并输出一个登陆页面。

var http = require('http');
var fs = require('fs');
var server = http.createServer((req,res) =>{
	console.log('url::'+req.url);
	fs.readFile('../public/static/index.html', null, function(err,data){
			if (err) {
				res.writeHead(404,{'Content-Type':'text/plain'});
				res.end('404 not found');
				return;
			}
			res.writeHead(200,{'Content-Type':'text/html'});
			res.end(data.toString());
		});
}).listen(3000);
console.log("server is staring in port:%d",3000);

本机Window7。打开cmd 切换到项目文件夹下面,执行node test.js。输出:server is staring in port:",3000代表服务启动成功,并且在函数中打印请求的url。然后打开浏览器输入 localhost:3000。看到浏览器中输出:

可以看出文件输出是成功的。WTF?我们去查看下服务端的log打印。

从图片中可以看出浏览器在获取Html文件后还会请求Html中css js 还有一个favicon.ico的图标。但是由于我们没有处理这些请求的代码,因而这些请求都是失败的。随着项目越来越大,url请求也会越来越多,我们需要解析不同url请求,做出不同action。而且解析还容易出错,要是有个框架帮我们做些事情,托管着静态文件,这样我们就可以针对业务,提高开发效率。Express就这样呼吁而出。

Express安装步骤:http://www.expressjs.com.cn/starter/installing.html

Express创建项目:http://www.expressjs.com.cn/starter/generator.html

不懂的地方请查看上面的连接,按照官方指引安装并创建项目代码。使用Express创建的项目会自动生成几个文件夹和文件。项目的结构也就出来了。其中最重要的文件就是根目录下的package.json文件。个人觉得它就是整个项目的配置文件,描述文件,里面有各种信息包括作者,包的引用,项目的入口文件等等,详情信息:http://www.cnblogs.com/tzyy/p/5193811.html。

如此我们就用express重新创建一个testApp的项目,并且使用express框架中的功能。cmd进入项目目录,运行npm install安装package.json中声明的依赖包。安装完成后会自动生成一个node_modules的文件夹,其中都是刚才

安装的中间件。打开app.js显示如下。

//引用中间件,类似java的import
var express = require('express'); 
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');//coookie 解析件
var bodyParser = require('body-parser');//coookie 解析件
//路由中间件
var index = require('./routes/index');
var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));//使用express的静态文件托管 

app.use('/', index);//当req.url == '/'的时候,会执行/routes/index中的函数,在index中的请求是get请求
app.use('/users', users);//当req.url == '/user'的时候,会执行/routes/user中的函数,在user中的请求是get请求

// catch 404 and forward to error handler
/如果没有找到资源就执行404
app.use(function(req, res, next) {
  var err = new Error('Not Found');
  err.status = 404;
  next(err);
});

// error handler
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;

其中的一些中间件在package.json中已经声明,npm install自动安装这些中间件。cookie解析件,body-parse中间件等等。之前这些都是和express一起的,现在从express中分离出去单独作为一个中间件的存在。在这里我觉得需要说明的是Nodejs的中间件的引用方式,以及代码最后那个module.export。

NodeJS是模块化编程,而java/c#/c++是class类。require是引入某个模块,类似java的import引入一个类一样,require写法是CommonJS规范:http://commonjs.org/specs/ ,也有一些代码会用import引入,

import express from 'express';
import db from './mongodb/db.js'

这种写法是ES6/7的引入模块的规范,v6.11.1还不支持ES6/7的书写规范,更多ES6/7的信息请网上查找。module.exports就是向外到处这个模块,别处就可以引用了。更多详情请参考NodeJS官网。下面我就修改app.js中代码使其输出我们登陆页面。把资源文件复制到public文件夹下面,然后启动Server,在浏览器中输入http://localhost:3000/static/index2.html。就可以访问到托管在express中public文件夹下的静态文件。

这个登陆模板是网上下载下来的,修改了下至于地址忘记从哪里下载的了。更多express的用法请访问Express官方文档介绍:http://www.expressjs.com.cn/

关于Express的简单安装,创建项目,使用就介绍到这了。下次我们将完善登陆功能,使用form提交,将使用mysql数据库做持久化。

NodeJS记 – 开启nodejs之旅

点击查看 之前一直从事Android方面的工作,负责公司产品的应用层app和修改framwork的工作。从一个月前开始从事后端开发,本来可以选择java做为后端开发的,对java比较熟悉,得···

参与评论