express-node.js

烨竹

简介

express 是基于node.js web 应用程式的一种开发框架,可以快速搭建一个功能完整的网站
express.js 是建构在Node.js 中介软体模组的,我们叫它connect,它的运作就是在处理HTTP请求的函数;每处理完一个中介软体函式,会再传给下一个中间软体的函式。(更多细节请看:https://goo.gl/ryvrte

npm uninstall 模块

删除本地模块时你应该思考的问题:是否将在package.json上的相应依赖信息也消除?
npm uninstall 模块:删除模块,但不删除模块留在package.json中的对应信息
npm uninstall 模块 --save 删除模块,同时删除模块留在package.json中dependencies下的对应信息
npm uninstall 模块 --save-dev 删除模块,同时删除模块留在package.json中devDependencies下的对应信息

安装express

如果,你要globally 安装,直接在command prompt 输入

npm install -g express

Node.js 应用程式初始化,自动加入package.json

在command prompt,首先,我们建立一个资料夹:

mkdir myapp
进入该资料夹:
cd myapp
输入指令:
npm init

根据步骤,输入与这个应用程式的相关资料,它会以询答的方式让你写入一些资讯,帮你建好一个package.json,myapp这就是你的一个node.js应用程式

自动生成package文件

安装express套件

npm install express --save

安装成功

web application

1、Web Server

var express = require('express');
var app = express();
 
// define routes here..
 
var server = app.listen(5050, function () {
    console.log('Node server is running..');
});

执行结果

2、设定路由
用app.get(), app.post(), app.put(), app.delete() 定义了HTTP的GET, POST, PUT, DELETE 的路由请求

var express = require('express');
var app = express();

app.get('/', function (req, res) {
    res.send("<html><body><h1>hello world</h1></body></html>");
});
 
app.post('/submit-data', function (req, res) {
    res.send('POST Request');
});
 
app.put('/update-data', function (req, res) {
    res.send('PUT Request');
});
 
app.delete('/delete-data', function (req, res) {
    res.send('DELETE Request');
});
 
var server = app.listen(5000, function () {
    console.log('Node server is running..');
});

3、处理post请求
新建index.html

<!DOCTYPE html>
 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
<form action="/submit-student-data" method="post">
        First Name: <input name="firstName" type="text" />
        Last Name: <input name="lastName" type="text" />
<input type="submit" />
    </form>
 
</body>

添加body-parser模块(是用来解析JSON, buffer,字串,及HTTP Post请求提交的url编码资料)

 npm install body-parser -save

安装成功如下图:

添加postapp.js

var express = require('express');
var app = express();
 
var bodyParser = require("body-parser");
app.use(bodyParser.urlencoded({ extended: false }));
 
app.get('/', function (req, res) {
    res.sendFile(__dirname+'/index.html');  //回应静态文件
});
 
app.post('/submit-student-data', function (req, res) {
    var name = req.body.firstName + ' ' + req.body.lastName;
 
    res.send(name + ' Submitted Successfully!');
});
 
var server = app.listen(5000, function () {
    console.log('Node server is running..');
});

4、使用静态文件app.use()

var express = require('express');
var app = express();
 
//setting middleware
app.use(express.static(__dirname + '/public')); //Serves resources from public folder
 
var server = app.listen(5050);

在myapp下新增一个public资料夹,里面存放一些静态文件

设立多个静态服务

var express = require('express');
var app = express();
 
app.use(express.static('public'));
 
//Serves all the request which includes /images in the url from Images folder
app.use('/images', express.static(__dirname + '/Images'));
 
var server = app.listen(5050);

app.use()第一个参数,images其实就像我们之前讲过的路由名称,
而实体位置是在__dirname /Images
在myapp下新增一个public资料夹,里面放入style.css;另外再新增一个Images的资料夹,里面放入图片a001.jpg

在http server提供静态服务—使用node-static
node-static module是http提供静态文件服务的模组。
安装

npm install -g node-static
cd myapp
npm install node-static --save

安装以后,我们可以使用node-static 模组了;

var http = require('http');
 
var nStatic = require('node-static');
 
var fileServer = new nStatic.Server('./public');
 
http.createServer(function (req, res) {
 
    fileServer.serve(req, res);
 
}).listen(5050);

数据库交互

Node.js支援多种不同种类的资料库主要介绍ms-sql和Mongodb
ms-sql
1、安装msql-driver

npm install mssql -g
cd myapp
npm install mssql --save

查看package.json是否安装成功;
2、建立资料库及资料表
在MS-SQL Server Management (MSSM) ,新增一个叫做SchoolDB的资料库,并且新增一个学生资料库叫做Student。如图:


添加数据:


3、连接资料库并且回应资料在网页上

var express=require('express');
var app=express();
app.get('/',function(req,res){
 var sql=require('mssql');
 
//config for your database
 var config={
    user:'sa',
    password:'justlookvvj',
    server:'localhost\\SQLEXPRESS',   //這邊要注意一下!!
    database:'SchoolDB'
 };
 
//connect to your database
 sql.connect(config,function (err) {
   if(err) console.log(err);
 
//create Request object
   var request=new sql.Request();
request.query('select * from Student',function(err,recordset){
   if(err) console.log(err);
 
//send records as a response
   res.send(recordset);
   });
 });
 
});
 
var server=app.listen(5050,function(){
 console.log('Server is running!');
});

这个例子我们载入了mssql module,并且呼叫connect()方法,透过参数config物件,去连线我们SchoolDB资料库。成功连线后,我们用sql.request物件,去执行"资料表查询",并且把资料取出来
MongoDB
MongoDB安装和操作见:https://www.jianshu.com/p/affa876ba35f
安装Mongo DB driver

npm install mongodb -g
cd myapp
npm install mongodb --save

新增数据

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

var url = 'mongodb://tester:password@localhost:27017/lxkdb';

// Use connect method to connect to the server
MongoClient.connect(url,{ useNewUrlParser: true }, function(err, db) {
  assert.equal(null, err);
  var dbo=db.db('lxkdb');  
  dbo.collection('student',function(err,collection){
    collection.insertOne({ id:1, firstName:'Steve', lastName:'Jobs' });
    collection.insertOne({ id:2, firstName:'Bill', lastName:'Gates' });
    collection.insertOne({ id:3, firstName:'James', lastName:'Bond' });
 
    collection.countDocuments(function(err,count){
        if(err) throw err;
        console.log('Total Rows:'+count);
    });
  });

  db.close();
});

结果如图:

修改数据

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

var url = 'mongodb://tester:password@localhost:27017/lxkdb';

// Use connect method to connect to the server
MongoClient.connect(url,{ useNewUrlParser: true }, function(err, db) {
  assert.equal(null, err);
  var dbo=db.db('lxkdb');  
  dbo.collection('student',function(err,collection){
        //collection.update
        //第一個參數是要更新的條件,第二個參數$set:更新的欄位及內容.
        //第三個參數writeConcern,第四個參數執行update後的callback函式
        collection.update({id:2},{ $set: { firstName:'James', lastName:'Gosling'} },
          {w:1}, function(err, result){
              if(err) throw err;
              console.log('Document Updated Successfully');
             });
         });

  db.close();
});

{w:1}的理解:http://aaron-joe-william.iteye.com
结果如图:

删除数据:

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

var url = 'mongodb://tester:password@localhost:27017/lxkdb';

// Use connect method to connect to the server
MongoClient.connect(url,{ useNewUrlParser: true }, function(err, db) {
  assert.equal(null, err);
  var dbo=db.db('lxkdb');  
  dbo.collection('student',function(err,collection){
        //collection.update
        //第一個參數是要更新的條件,第二個參數$set:更新的欄位及內容.
        //第三個參數writeConcern,第四個參數執行update後的callback函式
        collection.remove({id:2},{w:1},function(err,result){
            if(err) throw err;
            console.log('Document Removed Successfully!');
        });
    });

  db.close();
});

结果如图:

查询数据

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');

var url = 'mongodb://tester:password@localhost:27017/lxkdb';

// Use connect method to connect to the server
MongoClient.connect(url,{ useNewUrlParser: true }, function(err, db) {
  assert.equal(null, err);
  var dbo=db.db('lxkdb');  
  dbo.collection('student',function(err,collection){
    collection.find({firstName:"James"}).toArray(function(err,items){
        if(err) throw err;
        console.log(items);
        console.log("We found "+items.length+" results!");
    });

});

  db.close();
});

结果如图:

!!重要!!

关于更多Collection的操作,可以参考:Collection Methods,特别在使用查询find,有不同于以往SQL的使用语法

Pug 模板引擎

相关工具:pug转html ---------html转pug
模版引擎是帮助我们以最小的code去新增一个Html Template
它可以在客户端注入一些资料(像是JSON/XML) , Html Template,透过Template Engine产生最后的HTML呈现至浏览器

安装pug样版

//cd到myapp中
npm install pug --save
//检查package.json

添加Myviews文件夹,文件夹下添加pug文件

doctype html
html
    head
        title Jade Page
    body
        h1 This page is produced by Jade engine
        p some paragraph here..

添加js文件

var express = require('express');
var app = express();
 
//set view engine
app.set("view engine","pug")

//set view directory
app.set("views","MyViews")
 
app.get('/', function (req, res) {
    res.render('sample');  // render 执行pug文件
});
 
var server = app.listen(3000, function () {
    console.log('Node server is running..');
});

综合以上,要注意的是:
1.pug template必须写在.pug档案里
2.将副档名为.pug的档案,储存在网站根目录下面的views,express 預設從views資料夾取樣版。
3.如果要自订样版存放资料夹,我们在express server必须使用app.set(“veiws","自訂樣版存放資料夾絕對路徑")

不使用express,执行样版编译

var http = require('http'); // 1 - Import Node.js core module
var jade= require('pug');
 
var data=jade.renderFile('./MyViews/sample.pug');
 
var server = http.createServer(function (req, res) {   // 2 - creating server
 
    if (req.url == '/') { //check the URL of the current request
        // set response header
        res.writeHead(200, { 'Content-Type': 'text/html' });
        // set response content
        res.write(data);
        res.end();
    }else
        res.end('Invalid Request!');
});
 
server.listen(3000); //3 - listen for any incoming requests 
console.log('Node.js web server at port 3000 is running..')

除了汉字出现乱码没什么差别,如图

pug语法参考:https://pugjs.org/api/getting-started.html

pug与mysql交互(哈哈。其实本人对mysql比较有好感)

样板语法测试:http://naltatis.github.io/jade-syntax-docs/这个网站你肯定会用到的;

cd myapp
npm install mssql --save

pug

doctype html
html
head
title=title
body
    h1  mysql数据取出
 
    ul
        each item in catenameList
            li=item.catename

js

var express=require('express');
var app=express();
 
//set view engine
app.set("view engine","pug")
//set view directory
app.set("views","MyViews")
 
app.get('/',function(req,res){
    var mysql=require('mysql');
    //config for your database
    var con = mysql.createConnection({
        host: "localhost",
        user:'root',
        password:'root',
        database:'blog'
    });
    //connect to your database
    con.connect(function (err) {
        if(err) console.log(err);
        con.query('select catename from tp_cate',function(err,recordset){
            if(err)
                console.log(err);
            else
              res.render('sample',{catenameList:recordset});
        });
    });
 
});
 
var server=app.listen(3000,function(){
    console.log('Server is running!');
});

执行结果如下:

更多操作:https://www.w3schools.com/nodejs/nodejs_mysql_select.asp

Pug与mongodb交互

连接mongodb,取得资料

var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');



// Use connect method to connect to the server
module.exports.personList=function(callback){
    MongoClient.connect('mongodb://tester:password@localhost:27017/lxkdb'url,{ useNewUrlParser: true }, function(err, db) {
    assert.equal(null, err);
    var dbo=db.db('lxkdb');  
    dbo.collection('student',function(err,collection){
        collection.find({firstName:"James"}).toArray(function(err,items){
            if(err) throw err;
                db.close();
                callback(items);
        });

    });

    
    });
}

建立模板

doctype html
html
head
title=title
body
    h1 mongodb与pug交互
 
    ul
      for item in personList
        li= item.id + ":"
         p=item.firstName +' '+item.lastName

连接MongoDB,在express执行样版编绎,呈现资料

var mongodata=require('./app.js');
var express=require("express");
var app=express();
 
//set view engine
app.set("view engine","pug")
//set view directory
app.set("views","MyViews")
 
mongodata.personList(function(recordset){
    //console.log(recordset);
    app.get('/',function(req,res){
    res.render('sample', { personList:recordset });
   });
 
});
 
var server=app.listen(3000,function(){
    console.log('Server is running!');
});

执行如图:

pug引用bootstrap

下面用bootstraps制作页头页脚(layout)
寻找Bootstrap框架
首先,我们可以进入网站getbootstrap,点取上方连结Getting started,可以找到喜欢的框架版型

进入获取源码

将Html转换成Jade
进入http://html2jade.vida.io/

将转换好的额pug文件略作修改:放入layout.pug文件

编写js代码

//postapp.js
var mongodata=require('./app.js');
var express=require("express");
var app=express();
 
//set view engine
app.set("view engine","pug")
//set view directory
app.set("views","MyViews")
 //样式引用
app.use(express.static('public'));
mongodata.personList(function(recordset){
    //console.log(recordset);
    app.get('/',function(req,res){
    res.render('sample', { personList:recordset });
   });
 
});
 
var server=app.listen(3000,function(){
    console.log('Server is running!');
});
//app.js
var MongoClient = require('mongodb').MongoClient
  , assert = require('assert');



// Use connect method to connect to the server
module.exports.personList=function(callback){
    MongoClient.connect('mongodb://tester:password@localhost:27017/lxkdb',{ useNewUrlParser: true }, function(err, db) {
    assert.equal(null, err);
    var dbo=db.db('lxkdb');  
    dbo.collection('student',function(err,collection){
        collection.find({firstName:"James"}).toArray(function(err,items){
            if(err) throw err;
                db.close();
                callback(items);
        });

    });

    
    });
}

套用layout的pug

extends ./layout
 
block page-header
    h1 pug与bootstrap-------二哈
 
block content
    ul
      for item in personList
        li= item.id + ":"
         p=item.firstName +' '+item.lastName

执行如下:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容