第1页共20页软件平台技术课程总结题目:NodeJS班级:*****姓名:****学号:******2016年6月计算机与信息学院第2页共20页一、题目简介(200字左右,介绍题目的需求、应用背景及基本功能)Nodejs的需求分析:Node.js是一个Javascript运行环境(runtime)。实际上它是对GoogleV8引擎进行了封装。V8引擎执行Javascript的速度非常快,性能非常好。Node.js对一些特殊用例进行了优化,提供了替代的API,使得V8在非浏览器环境下运行得更好。NodeJS的基本功能:NodeJS是一个服务器端JavaScript解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。其实到今天为止,很少有哪些大的互联网公司是和Node.js无关的。LinkedIn,Yahho,Paypal,eBay,Walmart都在向Node.js迁移。国内的淘宝、网易、百度等也都有很多项目运行在Node.js之上。总而言之,NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。NodeJS的应用背景:1.RESTfulAPI:这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。2.统一Web应用的UI层:目前MVC的架构,在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。如果所有的关键业务逻辑都封装成REST调用,就意味着在上层只需要考虑如何用这些REST接口构建具体的应用。那些后端程序员们根本不操心具体数据是如何从一个页面传递到另一个页面的,他们也不用管用户数据更新是通过Ajax异步获取的还是通过刷新页面。3.大量Ajax请求的应用:例如个性化应用,每个用户看到的页面都不一样,缓存失效,需要在页面加载的时候发起Ajax请求,NodeJS能响应大量的并发请求。,二、界面介绍(200字左右,结合截图,对使用过程进行描述,重点介绍界面的布局、相关的功能、操作的流程)首先安装好nodejs,然后测试是否安装成功。如下:首先输入node命令进入编译环境。输出“HelloWorld”(nodejs不支持alert)第3页共20页接着退出编译环境,让其能在网页上访问。我在C盘的根目录下创建了一个app的文件夹,新建了一个记事本,写了如下代码:varhttp=require(http);http.createServer(function(req,res){res.writeHead(200,{Content-Type:text/html});res.write(h1Node.js/h1);res.write(pHelloWorld/p);res.end(pbeyondweb.cn/p);}).listen(3000);//启动服务器并侦听3000端口console.log(HTTPserverislisteningatport3000.);将其另存为test.js。再进入node编译模式。这样我就能在这样就可以在网页上访问js了。访问网址,网页效果如下:第4页共20页用supervosortest.js运行js,不用重新启动和编译,在修改js后,浏览器刷新一下则同步更新。(但首先要安装supervosor,用npm依赖包安装)创建一个项目:首先需要安装express(npminstall-gexpress和npminstall-gexpress-generator)然后通过express–tejsnewproject创建项目,再安装依赖包(npminstall),开启服务(nodebin/)。注意:express–tejsnewproject命令在express4.x中新建的是.jade不是.ejs的,.jade和.ejs代码风格不同,.ejs更接近html语言的风格。要想创建.ejs的文件应改成express–eejsnewproject。表示项目创建成功。二、数据的设计(200字左右,介绍数据结构、字段的含义,数据的约束、字段之间的关联等)首先我先介绍一点MongoDB的基本概念:1、MongoDB是NoSQL中面向文档的数据库,他是介于关系型数据库与非数据库之间的数据库产品。2、MongoDB的文档,相当于关系数据库中的一行数据。3、多个文档组成一个集合(collection),集合相当于关系数据库中的表4、多个集合,组合在一起,就是一个数据库5、一个运行的MongoDBServer支持多个数据库。首先安装mongodb,然后启动mongo服务。(D:mongodbbinmongod–dbpathD:mongodb\data\db)启动命令。在代码中访问数据库:首先我们在项目根目录下新建一个文件Settings.js存储数据库配置,文件内容如下:module.exports={cookieSecret:'blogxiaoma',//用于cookie加密,与数据库无关db:'blog',//数据库名称host:'localhost',//数据库地址port:27017};第5页共20页再在models目录下新建一个数据库连接模块db.js,文件内容如下:varsettings=require('../settings'),//加载保存数据库基本信息的模块Db=require('mongodb').Db,//加载MongDB数据库依赖模块,并调用相关对象Server=require('mongodb').Server;//设置数据库名称、数据库地址和数据库默认端口号创建一个数据库实例,然后通过module.exports输出创建的数据库连接module.exports=newDb(settings.db,newServer(settings.host,27017,{}),{safe:true});//mongodb数据库服务器的默认端口号:27017其中27017指的是mongod服务默认的端口号,这样我们就可以在其他模块中加载这个模块获得数据库连接进行增删改查数据的操作,比如User模块(对应models下的user.js文件)需要一项查找某用户名是否已存在的功能,代码如下:varmongodb=require('./db');//加载数据库模块//User构造函数,用于创建对象functionUser(user){this.name=user.name;this.password=user.password;};//输出User对象module.exports=User;//User对象方法:把用户信息存入MongodbUser.prototype.save=functionsave(callback){varuser={//用户信息name:this.name,password:this.password,};mongodb.open(function(err,db){if(err){returncallback(err);}//读取users集合,users相当于数据库中的表db.collection('users',function(err,collection){//定义集合名称usersif(err){mongodb.close();returncallback(err);}//把user对象中的数据,即用户注册信息写入users集合中collection.insert(user,{safe:true},function(err,user){mongodb.close();callback(err,user);});});});第6页共20页}//Usr对象方法:从数据库中查找指定用户的信息User.get=functionget(username,callback){mongodb.open(function(err,db){if(err){returncallback(err);}//读取users集合db.collection('users',function(err,collection){if(err){mongodb.close();returncallback(err);}//从users集合中查找name属性为username的记录collection.findOne({name:username},function(err,doc){mongodb.close();if(doc){//封装查询结果为User对象varuser=newUser(doc);callback(err,user);}else{callback(err,null);}});});});};这段代码看起来稍微复杂一些,其实只是因为异步的回调函数书写让它看起来复杂了,其实实现的功能很简单,打开网站所用的数据库,在'users'集合中查找name键值等于传入的username的单个文档,不管连接打开成功与否,查到文档与否,均要调用传入的回调函数,只是如果查到了会将结果作为参数传入回调函数。(百度上找的解释,自己跟着学习了一下。)第7页共20页发布界面:首页界面:第8页共20页登陆界面:注册界面:第9页共20页秀秀我发的微博:三、功能模块实现(500字左右,重点描述核心功能的实现细节。结合设计完成过程,对主要功能模块的源码做出分析和说明)app.js:源码如下://加载依赖库varexpress=require('express');varpath=require('path');varfavicon=require('serve-favicon');varlogger=require('morgan');varcookieParser=require('cookie-parser');varbodyParser=require('body-parser');//加载路由控制varroutes=require('./routes/index');//varusers=require('./routes/users');//使用时新添加的,上面的依赖包是创建文件时自带的。varsettings=require('./settings');//数据库连接//session会话varsession=require('express-session');//session使用varMongoStore=require('connect-mongo')(session);//mongodb使用varsessionStore=newMongoStore({第10页共20页host:settings.host,//definethis,otherwiseitthrowsError:failedtoconnectto[1276.0.0.1:27017]port:settings.port,db:settings.db},function(){console.log('connectmongodbsuccess...');});//引入flash模块来实现页面通知varflash=require('connect-flash');//req.flash()使用(需要安装flash)//process.setMaxListeners(0);//不能解决(node)warning:possibleEventEmittermemoryleakdetected.11reconnectlistenersadded.Useemitter.setMaxListeners()toincreaselimit.//创建项目实例varapp=express();//viewenginesetup//设置模板引擎的位置和格式app.set