Nodejs新手村指引——30分鍾上手


概要

#准備工作

#開啟簡單的服務

#路由

#獲取參數的三種方式

#靜態文件

#數據庫集成

#async解決多重嵌套問題

 

本文適合沒有nodejs項目開發經驗而又想對nodejs有個大概了解的你閱讀,30分鍾上手,也許還不用

*****************************************************

#准備工作

安裝好nodejs以后,新建文件夾,起名叫demo-project,在文件夾根目錄新建文件app.js作為nodejs應用的入口文件。

打開終端(window上叫命令提示符),進入demo-project根目錄,輸入以下命令並回車初始化package.json

npm init

 

命令行會提示你輸入項目名稱name/版本version/描述description,都使用默認值(直接按回車)就好,輸入完description后提示輸入應用入口文件名entry point,如果你的入口文件名不叫app.js,輸入對應的名稱就好,否則一路回車到初始化完成。

初始化完成后demo-project根目錄會多出來一個package.json的文件,內容就像這樣

{
  "name": "node-project",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

 

接下來安裝express,express是一個基於nodejs平台的web開發框架

npm install express --save

 

准備工作告一段落。

#開啟簡單的服務

express開啟一個服務非常簡單,分三步:引入express=>實例化=>監聽端口

var express = require('express'),
    app = express(),
    PORT = 3000;

app.get('/', function(req, res){
    res.send('Hello World');
})

app.listen(PORT, function(){
    console.log('服務器已經啟動~');
})

 

在終端輸入node app.js啟動服務

打開瀏覽器訪問:localhost:3000,頁面成功打印出Hello World

將app.js中的“Hello World”改成“你好,javascript”,按ctrl+c停止服務然后再輸入node app.js(或者直接按方向鍵⬆)回車重啟服務,刷新瀏覽器,成功打印出“你好,javascript”,為了避免修改一次就重啟一次服務這種無聊的事情,需要安裝supervisor來監聽文件改動自動重啟服務

npm install supervisor --save

 

mac玩家安裝失敗請嘗試在命令前面加sudo以管理員身份安裝

sudo npm install supervisor --save

 

安裝完成以后啟動服務請使用supervisor app.js命令,它的作用是啟動並監聽文件狀態,發現文件改動立即自動重啟服務,不必再使用node app.js。

2016年7月2日補充:supervisor在mac環境使用占用cpu超高,筆記本發燙,推薦使用hotnode,用法一樣,比supervisor好一些;

#路由

路由 = 路徑 + http方法

路由是由一個路徑和特定的http方法構成,每個路由可以對應多個處理函數,基本結構app.METHOD(PATH, HANDLER),app是express的實例,METHOD是http請求方式中的一個,path是服務端路徑,HANDLER是路由匹配到時執行的函數

幾個路由實例,可以用ajax分別改變請求type對下面三個接口進行驗證

app.get('/a', function(req, res){
    res.send('這是一個get請求');
})
app.post('/b', function(req, res){
    res.send('這是一個post請求');
})
app.delete('/c', function(req, res){
    res.send('這是一個delete請求');
})

 

HANDLER 函數有兩個參數req/res,即request/response,請求頭和響應頭,請求頭可以用來獲取請求的參數、當前頁面的路徑等等,響應頭可以向頁面返回數據或渲染指定頁面。

獲取參數有三種方式,詳見:#參數獲取的三種方式

res.render方法指定瀏覽器渲染的頁面,比如寫一個訪問首頁的路由,路徑為/,並向首頁傳遞數據{title: '首頁'}

在項目根目錄下新建文件夾views存放視圖,在views下新建index.jade,jade是nodejs的模板引擎,語法非常簡練,類似的還有EJS模板

// 指定視圖路徑和模板引擎jade
var path = require('path');
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');
// 路由
app.get('/', function(req, res){
    res.render('index', {
        title: '首頁'
    })
})

 

index.jade

html
    head
        title #{title}
    body
        .content 這里是#{title}

 

渲染

#獲取參數的三種方式

 express獲取前端傳遞過來的參數有三種方式

1、通過路徑傳遞,用req.params.key獲取

// 路由
app.get('/:name', function(req, res){
    console.log(req.params.name)
    res.render('index',{
        title: '首頁'
    })
})
// 假如路徑是 http://localhost:3000/wangmeijian
// console.log(req.params.name)
// 結果 wangmeijian

 

 

2、get方式傳遞,用req.query.key獲取

// 路由
app.get('/', function(req, res){
    console.log(req.query.sex)
    res.render('index',{
        title: '首頁'
    })
})
// 假如路徑是 http://localhost:3000?sex=20
// console.log(req.query.sex)
// 結果 20

 

 

3、請求參數只要包含鍵值對,用req.body獲取,借用express官網的例子,app.use是中間件,何謂中間件?就是任何請求都要經過它,它可以修改req和res,可以終止請求,可以調用下一個中間件

var app = require('express')();
// 依賴body-parser和multer來解析參數
var bodyParser = require('body-parser');
var multer = require('multer'); 
// 中間件
app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

app.post('/', function (req, res) {
  console.log(req.body);
  res.json(req.body);
})

 

 

#靜態文件

文件目錄

jade模板要引用static目錄下單css、js、img等靜態資源,需要先通過express.static托管靜態資源,express.static是express(4.xx版本)唯一一個內置中間件,其它中間件都需要額外安裝

app.use(express.static('static'));

 

托管之后就可以訪問了,注意訪問路徑不含static

http://localhost:3000/img/a.jpg
http://localhost:3000/css/b.css
http://localhost:3000/js/c.js

 

#數據庫集成

服務端當然要有數據庫,nodejs支持多種數據庫,比較流行的包括mysql/mongodb,mongodb可以直接以json形式存儲數據,mongodb沒有表和列的概念,與之對應的是集合和字段

先自行安裝mongodb,然后安裝mongoose包,mongoose它可以很方便地在nodejs中操作mongodb

npm install mongoose --save

 

mongoose有三個概念,模式/模型/文檔

模式用來定義數據類型

模型是模式編譯出來的,可以理解為構造函數

文檔是模式的實例,不理解看看栗子就明白了

var mongoose = require('mongoose');
// localhost為mongodb地址,本地安裝使用localhost即可,testdb為數據庫名稱,如果不存在會自動創建
mongoose.connect('mongodb://localhost/testdb',function(err){
    if(err){
        return console.error(err);
    }
    console.log('數據庫連接成功');
})
// 模式,定義數據類型
var studentSchema = new mongoose.Schema({
    name: String,
    age: Number
})
// 模型,第一個參數為模型名稱,第二個參數為模式名,第三個參數是集合名稱,如果不傳,mongodb會自動在模型名稱后面加s做為集合名
var Student = mongoose.model('student', studentSchema);
// 文檔
var student = new Student({
    name: '張三',
    age: 21
})
// save方法存入數據庫
student.save(function(err){
    if(err){
        return console.log(err)
    }
    console.log('數據插入成功')
    // 模型.find方法查詢
    Student.find({age: 21},function(err, result){
        if(err){
            return console.error(err);
        }
        console.log('查詢結果:')
        console.log(result)
    })
})

  

#async解決多重嵌套問題

上面的student.save只存入了一次數據然后查詢,代碼只有一層嵌套,假如有這樣一個業務場景,有5條學生信息數據插入數據庫,插入完成后立即查詢出這5條數據,按上面的寫法將會有6層嵌套,嵌套多了,維護是個問題,怎么解決這個問題?

async.each方法解決了這個問題,當然它也需要單獨安裝,async提供簡單而強大的功能來處理javascript異步編程。

npm install async --save

 

語法:async.each(coll, iteratee, callback),官方文檔

coll遍歷的集合

iteratee迭代過程

callback回調,迭代執行完畢或迭代過程發生錯誤都會觸發回調

栗子🌰

/*#async解決多重嵌套*/
var async = require('async');
var studentSchema = new mongoose.Schema({
    name: String,
    age: Number
})
var Student = mongoose.model('student', studentSchema);
var data = [
    new Student({
        name: 'a',
        age: 18
    }),
    new Student({
        name: 'b',
        age: 28
    }),
    new Student({
        name: 'c',
        age: 32
    }),
    new Student({
        name: 'd',
        age: 26
    }),
    new Student({
        name: 'e',
        age: 29
    })
]

async.each(data, function(item, callback){
    item.save(function(err){
        callback(err);
    })
},function(err){
    if(err){
        console.log(err);
    }
    // 沒有錯誤表示數據全部插入完成,可以查詢
    Student.find({}, function(err, result){
        if(err){
            return console.log(err);
        }
        console.log(result);
    })
})

 

查詢結果

{ __v: 0, age: 28, name: 'b', _id: 572d965bcd38199a9c3817c3 },
{ __v: 0, age: 18, name: 'a', _id: 572d965bcd38199a9c3817c2 },
{ __v: 0, age: 26, name: 'd', _id: 572d965bcd38199a9c3817c5 },
{ __v: 0, age: 32, name: 'c', _id: 572d965bcd38199a9c3817c4 },
{ __v: 0, age: 29, name: 'e', _id: 572d965bcd38199a9c3817c6 }

有了async.each異步流程控制,告別嵌套,代碼看着也舒服。 

以上是nodejs在新手村最初需要弄明白或者會遇到的一些問題。如果看完有幫助,可以給點鼓勵~

 

作者:王美建
出處:http://www.cnblogs.com/wangmeijian
本文版權歸作者和博客園所有,歡迎轉載,轉載請標明出處。
如果您覺得本篇博文對您有所收獲,請點擊右下角的 [推薦],謝謝!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM