NodeJS学习笔记(一)

    最近公司要启动一个移动项目,在后台系统的选型上,可选的有PHP、Java、NodeJS,从技术上来讲,Java较为成熟,但开发速度较慢,性能稳定;PHP开发迅速,但稳定性不高,性能也通常,开发效率较高;NodeJS的性能较高,能够处理更多的链接和iO问题,因此最终选择了NodeJS。
   NodeJS本质来讲是一个服务器端的Javascript,可是其使用起来,并非那么容易,我大体的学习过程以下,我买了两本书,一本是朴灵的《深刻浅出NodeJS》,一本是赵坤等的《Node.JS实战》,相对来讲,前者对个人影响更大,让我对NodeJs有了一个直观的了解,朴灵的介绍偏向底层,对框架性的极少较少,后来我就买了第二本书,可是只是大体翻了一下,坦白来讲,我以前对NodeJS的了解等于零,对JQuery也只有粗浅的研究,因此遇到了不少困难。最后我清理了一下思路,选择Sails MVC框架。
   我要解决的问题也很简单,须要为移动APP提供后台支持,须要提供HTTP服务,支持MySQL数据库,以及其余的缓存数据库,并要和PHP框架Laravel开发的WEB程序互通,第一个问题就是须要可以采用一样的加密算法对密码加密和比对。这些问题下面会以此解决。
   NodeJS的安装比较简单,在nodejs.org上下载对应操做系统的包便可,目前的版本是0.10.31,Windows和Mac平台能够直接安装,Linux平台须要本身编译,编译过程很简单,依次运行./configure,make,sudo make install便可,如今的NodeJS默认会安装NPM,就是NodeJS的包管理工具,大部分的模块均可以经过这个工具安装。
  常见的Nodejs资源是nodejs.org和github.com,前者包含官方文档,后者能够搜索到一些你须要的包,虽然大部分的包网上都能找到教程,可是教程很容易过期,最好看看github.com上的对应的说明,或者下载安装模块后,看模块目录下的README.Md,能够知道一些基本的用法,避免在起始配置上花费过多的时间。
  在寻找模块时,能够看看其评价,寻找评价较好的模块,由于nodejs的模块实在太多了。
  开发nodejs时,我知道的工具备nodeclipse、Netbeans、WebStorm,相对来讲,WebStorm较好,不过须要钱,nodeclipse也不错,只不过感受不稳定,Netbeans增长一个插件就能够了,可是没有调试功能,只是一个运行命令而已,好在它的编辑功能很强大。其余的sublime和notepad++均可以用,最终我用的仍是Netbeans,由于能够和PHP、Java程序公用一个环境,Eclipse有点太大了,最近不怎么喜欢了。
  nodejs的程序其余的程序如PHP、Java有很大的不一样,若是它有的地方出错了,整个系统就崩溃了,但PHP和Java都不会,他们只会在出错的地方出错,其余的地方正常运行。由于nodejs本质来讲,其主体线程只有一个,崩溃了就没有了。因此要特别当心,可是也有其优势,访问全局变量要容易的多,好比Sessioin、缓存等。不过一样须要注意其内存分配问题,全局变量可能会永远存在,容易形成内存泄漏问题。
   安装nodejs模块的命令式npm install module_name,这会在当前目录下建立一个node_modules,里面是包含的模块,若是要安装全局模块,须要用npm install module_name -g,这会在主目录下建立node_modules,里面存储包含的模块。模块名能够在命令中指定,也能够在当前目录下的package.json中指定。下面以express为例说明一下。
   学习nodejs常见的组件是express,这是一个简单的提供http服务的mvc框架,相似于PHP的laravel,或者Java的Spring,固然其功能要弱一些,安装命令为npm install -g express,而后用express命令安装,有如下几种状况:
   express #在当前目录下建立express框架,默认使用jade引擎
   express -e #在当前目录下建立express框架,默认使用ejs引擎
   express project#在project目录下建立express框架,默认使用jade引擎 
   express -e project#在project目录下建立express框架,默认使用ejs引擎
   express --version #显示当前版本
   也能够用express -h,查看全部的帮助信息
  目前的express的版本为4.9.0,在4.0以后,默认的express框架再也不集成常见的connect模块,详细的connect信息能够参考https://github.com/senchalabs/connect,好比想要增长session支持,能够参考页面上的express-session模块。
  默认的页面渲染引擎有两种: jade和ejs,ejs相似于php的方式将js脚本嵌入到html代码中,虽然看起来比较乱,可是习惯了也没什么,jade有点难以理解,不太适应,好像效率也不高,就选择了ejs引擎。
  默认的package.json以下
{
  "name": "test",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "express": "~4.9.0",
    "body-parser": "~1.8.1",
    "cookie-parser": "~1.3.3",
    "morgan": "~1.3.0",
    "serve-favicon": "~2.1.3",
    "debug": "~2.0.0",
    "ejs": "~0.8.5"
  }
}
在运行完express -e命令以后,系统会提示你到目录中运行npm install命令,这个命令会根据package.json的dpendencies的属性下载模块安装。如须要增长session支持,能够运行npm install express-session,也能够在package.json的dependencies增长一行,以下  
"dependencies": {
    "express": "~4.9.0",
    "body-parser": "~1.8.1",
    "cookie-parser": "~1.3.3",
    "morgan": "~1.3.0",
    "serve-favicon": "~2.1.3",
    "debug": "~2.0.0",
    "ejs": "~0.8.5",
    "express-session":"*"
  }
而后运行npm install命令就能够了。
运行express的命令以下:
  node ./bin/www
就是在根目录下的bin目录下的www文件,这是一个js文件,运行以后,就能够在浏览器中查看运行结果,默认的首页为http://localhost:3000,
express框架的目录也很清楚,大体以下
D:.
│  app.js                              #主要的入口文件,或者提及始文件
│  package.json                   #模块配置文件
├─bin
│      www                           #启动文件:命令为 node www
├─public                             #一些静态文件,如图片、JS、CSS文件
│  ├─images
│  ├─javascripts
│  └─stylesheets
│          style.css
├─routes                     #路由文件,目前express支持将将一个虚拟目录下的请求放到要给路由文件中,这是在app.js中定义的
│      index.js                #app.use('/',routes)  ->根目录下的路由  
│      users.js                #app.use('/user',users)  ->user目录下的路由
└─views                      #mvc的view层,目前都为ejs文件
        error.ejs
        index.ejs
不过目前来讲,express不支持控制器,其逻辑经常要写在routes文件中,不过能够将逻辑放在其余文件中,而后require进来。
默认的路由文件index.js以下:
var express = require('express');
var router = express.Router();
 
/* GET home page. */
router.get('/', function(req, res) {
  res.render('index', { title: 'Express' });
});
 
module.exports = router;
这个也很是容易理解,这里只有一个针对根目录的路由,是以get方式访问的,对应的函数有两个参数,req和res,分为为输入对象和输出对象。具体的api说明能够访问主站页面: http://expressjs.com/4x/api.html,下面作个简单的归纳
1)req
    req.params.name    ->/user/:name
    req.query.name      ->/user?name=shiyq
    req.body.name       ->名称为name的表单输入值
    req.param(name)    ->以上的三种输入都支持,次序为params,body,query
    req.cookie.name     ->cookie的name属性
2)res
    res.cookie(name,value)   ->设置cookie
    res.redirect('/foo/bar')    ->跳转到/foo/bar
    res.location('foo/bar')     ->相似redirect
    res.send('<p>name</p>')  ->向浏览器输出
    res.json()                            ->想浏览器返回json数据
     res.render(view, [locals], callback)  ->转向view,并携带变量
    res.end()                            ->结束输出
让express支持session,须要安装express-session模块,查看相应模块下的README.Md文件,能够看到以下内容
var express = require('express')
var session = require('express-session')
 
var app = express()
 
app.use(session({
  secret: 'keyboard cat',
  resave: false,
  saveUninitialized: true
 
}))
    可知这个express-session须要紧跟express的定义,其使用方式是app.use(),若是位置太靠后,可能会出现问题,须要注意,其默认使用方式为req.session.name,默认的express-session将session保存在内存中,若是想保存到redis,memcache以及mongodb,须要集成另外的组件,能够在github.com上寻找,同时要记得阅读README.Md文件
    到此为止,就能够进行基本的express开发了,可是很容易发现修改了代码以后,系统并不生效,nodejs没有所谓的热启动机制,须要从新启动程序,不过每次启动就太麻烦了,因此要使用自动启动的工具,supervisor,安装方式为npm install supervisor -g,执行命令为supervisor app.js,能够用supervisor -h查看帮助,通常来讲须要设置-w或者-i开关,-w表明监控的目录,只有这些目录下的文件修改了才会从新启动node,默认为当前目录“.”,目录以“,”间隔,-i是忽略某些目录。-w开关很是有用,好比某些程序会在当前目录下建立临时文件,就会不停的重启,须要设置只有某些目录修改才须要启动,如sails框架,其目录结构以下
这里明显有个临时文件.tmp,若是直接运行supervisor app.js,就会出现不停重启的现象,因此我在根目录下写了一个sailsjs.bat文件,内容为
    supervisor -w api,assets,config,node_modules,tasks app.js
这就能够解决不停重启的问题了。
相关文章
相关标签/搜索