Nodejs小型服務(wù)器

前言

使用javascript就可以給自己搭建一個(gè)服務(wù)器磷支,還沒(méi)配置node環(huán)境的可以看我的一篇文章windows如何快速的搭建node環(huán)境选侨,該文章篇幅較長(zhǎng)鱼鼓,請(qǐng)細(xì)心閱讀

用途

  1. 展示個(gè)人主頁(yè)以及其他的網(wǎng)頁(yè)
  2. 靜態(tài)資源(可以這樣訪(fǎng)問(wèn) http://localhost:3000/static/images/head.jpg
  3. API接口 (給前端ajax調(diào)用钉跷,并返回json數(shù)據(jù))

大神勿噴

本教程只是用nodejs寫(xiě)一個(gè)小型服務(wù)器,自己覺(jué)得這樣夠用状共,大神繞過(guò)

項(xiàng)目結(jié)構(gòu)

myserver

node_modules // 依賴(lài)文件
db // 數(shù)據(jù)庫(kù)相關(guān)

  • db,js
  • setting.json

static // 靜態(tài)資源目錄

  • images
  • javascripts
  • stylesheets
  • others

views // view層的html文件或者其他模板引擎(.jade套耕、.ejs)

  • index.jade
  • layout.jade

routes // 路由控制

  • index.js
  • about.js

apis // api接口

  • postlist.js

app.js // 啟動(dòng)文件
package.json // 項(xiàng)目的配置信息


目錄.PNG

具體分析

app.js

啟動(dòng)文件,整個(gè)項(xiàng)目的入口文件峡继,核心代碼

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 09:50:59 
 * @Purpose: 服務(wù)器主入口
 */

let express = require('express'); // express框架
let app = express(); // express

app.use('/static', express.static('static')); // 設(shè)置靜態(tài)資源目錄

app.set('view engine', 'jade'); // 設(shè)置模板引擎
app.set('views', __dirname + '/views'); // 設(shè)置模板的目錄

let index = require('./routes/index');
let postlist = require('./apis/postlist');

// 當(dāng)用戶(hù)訪(fǎng)問(wèn)/的時(shí)候,執(zhí)行index函數(shù)匈挖,該函數(shù)輸出index.jade內(nèi)容
app.get('/', index);

// 當(dāng)用戶(hù)get該地址的時(shí)候碾牌,執(zhí)行postlist函數(shù),該函數(shù)查詢(xún)數(shù)據(jù)庫(kù)的數(shù)據(jù)儡循,并以json的形式返回給用戶(hù)
app.get('/api/postlist', postlist);

app.listen(3000); // 監(jiān)聽(tīng)3000端口
routes/index.js

routes是存放所有路由的文件夾舶吗,每個(gè)文件對(duì)應(yīng)返回views文件夾對(duì)應(yīng)的jade文件,然后輸出給用戶(hù)看

/*
 * @Author: likang xie 
 * @Date: 2018-08-31 18:20:11 
 * @Purpose: 主頁(yè)路由控制函數(shù)
 */

let index = (req, res) => {
  // 參數(shù)二:傳遞給jade文件的數(shù)據(jù)择膝,服務(wù)端渲染的話(huà)誓琼,通常這里會(huì)有一步數(shù)據(jù)庫(kù)查詢(xún)/請(qǐng)求接口,然后傳遞給jade文件
  res.render('../views/index.jade', {
    title: '主頁(yè)'
  });
}

module.exports = index; // 導(dǎo)出該函數(shù)肴捉,app.js里導(dǎo)入改函數(shù)
views/index.jade

views是存放所有view層的模板文件的文件夾(該項(xiàng)目用的是jade模板)腹侣,具體的語(yǔ)法查看jade文檔

// index.jade
extends layout.jade // 繼承模板文件
block content
  p 您好,這里是#{title}

layout.jade是公共的模塊齿穗,可以寫(xiě)類(lèi)似的header傲隶、footer等公共模塊

// layout.jade
doctype html
html
  head
    title= title // 動(dòng)態(tài)設(shè)置title,routes傳遞過(guò)來(lái)的數(shù)據(jù)
    meta(charset="UTF-8")
    meta(name="viewport", content="width=device-width, initial-scale=1.0, user-scalable=no")
    meta(http-equiv="X-UA-Compatible", content="ie=edge")
    meta(name="renderer", content="webkit")
  body
block content // content 是該模塊的名字
apis/postlist.js

apis是存放所有的api函數(shù)的文件夾窃页,函數(shù)具體內(nèi)容是讀取數(shù)據(jù)庫(kù)跺株,返回json數(shù)據(jù)(postlist命名只是我一個(gè)示例,獲取文章集合)

查詢(xún)數(shù)據(jù)庫(kù)

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 10:00:14 
 * @Purpose: 文章列表接口
 */

let pool = require('../db/db');

let postlist = (req, res) => {

  let query = req.query; // 獲取用戶(hù)參數(shù)(GET的query脖卖、GET的params乒省、POST參數(shù)獲取方式步一樣,后面會(huì)講)
  let sql = ''; // sql查詢(xún)語(yǔ)句

  // 建立連接池
  pool.getConnection((err, conn) => {
    // 執(zhí)行查詢(xún)語(yǔ)句
    conn.query(sql, (err, results) => {
      res.json({
        code: 200,
        message: '請(qǐng)求成功',
        postlist: results
      });

      // 釋放連接池
      conn.release();
    })
  })

}

module.exports = postlist;

無(wú)數(shù)據(jù)庫(kù)

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 10:00:14 
 * @Purpose: 文章列表接口
 */

let postlist = (req, res) => {
  res.json({
    code: 200,
    message: '請(qǐng)求成功',
    data: []
  })
}

module.exports = postlist;
db/db.js

db是存放有關(guān)數(shù)據(jù)庫(kù)的文件畦木,主文件db.js袖扛,配置文件setting.json

/*
 * @Author: likang xie 
 * @Date: 2018-09-04 10:08:48 
 * @Purpose: 數(shù)據(jù)庫(kù)連接主文件 
 */

var mysql = require('mysql'); // 引入mysql依賴(lài)
var setting = require('./setting.json'); // 引入配置文件

var pool = mysql.createPool(setting); // 創(chuàng)建連接池

module.exports = pool; // 導(dǎo)出pool,在需要連接的地方導(dǎo)入該方法

setting.json

{
  "host": "localhost",
  "user": "xielikang",
  "password": "123456",
  "database": "post",
  "port": 3306
}
package.json

目前用到的依賴(lài)暫時(shí)只有

{
  "devDependencies": {
    "express": "^4.16.3",
    "jade": "^1.11.0",
    "mysql": "^2.16.0"
  }
}

項(xiàng)目運(yùn)行

請(qǐng)先下載此項(xiàng)目的模板

推薦全局安裝nodemon插件馋劈,當(dāng)修改代碼的時(shí)候ctrl+s便自動(dòng)重新編譯執(zhí)行攻锰,不用手動(dòng)重啟

  1. 全局安裝nodemon插件晾嘶,還沒(méi)配置淘寶鏡像的建議先配置淘寶鏡像 http://npm.taobao.org/
cnpm install nodemon -g
  1. 在此目錄打開(kāi)命令行
nodemon app.js

4 瀏覽器打開(kāi)http://localhost:3000/訪(fǎng)問(wèn)主頁(yè)

  1. 瀏覽器輸入http://localhost:3000/api/postlist來(lái)查看返回的json數(shù)據(jù)

  2. 瀏覽器輸入http://localhost:3000/static/images/head.jpg來(lái)查看自己的靜態(tài)文件(當(dāng)然你得有這個(gè)文件,圖片娶吞,樣式垒迂,腳本)

擴(kuò)展
  1. 擴(kuò)展其他頁(yè)面(如about頁(yè)面)
// app.js
var about = require('./routes/about');
app.get('/about', about);
  1. 擴(kuò)展api接口
// app.js
var userinfo= require('./apis/userinfo');

app.get('/api/userinfo', userinfo); // get query方式

app.get('/api/userinfo/:uid', userinfo);// get params方式
  1. 各種情況下參數(shù)的獲取

get query參數(shù)獲取(url?uid=2)

let query = req.query.uid;

get params參數(shù)獲榷噬摺(url/2)

let params = req.params.uid;

post參數(shù)獲取

// app.js
var bodyparser = require('body-parser'); // 先引入該中間件
// 然后使用它机断,具體參數(shù)請(qǐng)自行百度
app.use(bodyparser.urlencoded({
  extended: false
}));
let body = req.body;
將此項(xiàng)目運(yùn)行在云主機(jī),讓大家訪(fǎng)問(wèn)
  1. 購(gòu)買(mǎi)云主機(jī)绣夺,配置好(騰訊云吏奸,阿里云等)
  2. 復(fù)制項(xiàng)目到云主機(jī)(配置node環(huán)境),然后運(yùn)行
  3. 通過(guò)ip地址訪(fǎng)問(wèn)項(xiàng)目(http://119.29.73.229)
  4. 如果你的主機(jī)綁定了域名(http://www.xxx.com)
  5. 如果你有https證書(shū)(https://www.xxx.com)
  6. 如果你不把端口改為80陶耍,而是其他(http://www.xxx.com:3000)奋蔚,這樣會(huì)很難看
  7. 當(dāng)然,建議把監(jiān)聽(tīng)的端口http的改為80烈钞,https的改為443
nodejs配置https證書(shū)泊碑,同時(shí)開(kāi)啟http和https

app.js

// app.listen(3000); // 這一段刪掉

var http = require('http'); // http模塊
var https = require('https'); // https模塊
var fs = require('fs'); // 文件讀寫(xiě)模塊

// 證書(shū)文件,自己去下載對(duì)應(yīng)的版本
var privateKey = fs.readFileSync('./static/path/to/2_www.xielikang.com.key', 'utf8');
var certificate = fs.readFileSync('./static/path/to/1_www.xielikang.com_bundle.crt', 'utf8');
var credentials = {
  key: privateKey,
  cert: certificate
};

const PORT = 80; // http端口
const SSLPORT = 443; // https端口
// 創(chuàng)建http服務(wù)器
var httpServer = http.createServer(app);
// 創(chuàng)建https服務(wù)器
var httpsServer = https.createServer(credentials, app);
// 監(jiān)聽(tīng)80端口
httpServer.listen(PORT, function () {
  console.log('HTTP Server is running on: http://localhost:%s', PORT);
});
// 監(jiān)聽(tīng)443端口
httpsServer.listen(SSLPORT, function () {
  console.log('HTTPS Server is running on: https://localhost:%s', SSLPORT);
});

最后

本文到此結(jié)束毯欣,希望以上內(nèi)容對(duì)你有些許幫助馒过,如若喜歡請(qǐng)記得點(diǎn)個(gè)關(guān)注哦 ??

image

微信公眾號(hào)「前端宇宙情報(bào)局」,將不定時(shí)更新最新酗钞、實(shí)用的前端技巧/技術(shù)性文章腹忽,歡迎關(guān)注,一起學(xué)習(xí) ??

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末砚作,一起剝皮案震驚了整個(gè)濱河市窘奏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偎巢,老刑警劉巖蔼夜,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異压昼,居然都是意外死亡求冷,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)窍霞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)匠题,“玉大人,你說(shuō)我怎么就攤上這事但金【律剑” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钱磅。 經(jīng)常有香客問(wèn)我梦裂,道長(zhǎng),這世上最難降的妖魔是什么盖淡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任年柠,我火速辦了婚禮,結(jié)果婚禮上褪迟,老公的妹妹穿的比我還像新娘冗恨。我一直安慰自己,他們只是感情好味赃,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布掀抹。 她就那樣靜靜地躺著,像睡著了一般心俗。 火紅的嫁衣襯著肌膚如雪傲武。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天城榛,我揣著相機(jī)與錄音谱轨,去河邊找鬼。 笑死吠谢,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的诗茎。 我是一名探鬼主播工坊,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼敢订!你這毒婦竟也來(lái)了王污?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤楚午,失蹤者是張志新(化名)和其女友劉穎昭齐,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矾柜,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡阱驾,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了怪蔑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片里覆。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖缆瓣,靈堂內(nèi)的尸體忽然破棺而出喧枷,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布隧甚,位于F島的核電站车荔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏戚扳。R本人自食惡果不足惜忧便,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咖城。 院中可真熱鬧茬腿,春花似錦、人聲如沸宜雀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)辐董。三九已至悴品,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間简烘,已是汗流浹背苔严。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留孤澎,地道東北人届氢。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像覆旭,于是被迫代替她去往敵國(guó)和親退子。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理型将,服務(wù)發(fā)現(xiàn)寂祥,斷路器,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • 寫(xiě)在開(kāi)頭 先說(shuō)說(shuō)為什么要寫(xiě)這篇文章, 最初的原因是組里的小朋友們看了webpack文檔后, 表情都是這樣的: (摘...
    Lefter閱讀 5,273評(píng)論 4 31
  • 你若盛開(kāi),愛(ài)情它愛(ài)來(lái)不來(lái) 文/小小獅子座 一: 發(fā)小菲菲打來(lái)電話(huà)腕铸,一開(kāi)口就...
    小小獅子座閱讀 499評(píng)論 0 2
  • 2018年2月13日的早上惜犀,那天的溫度大概在16度左右,甜甜穿了一個(gè)超級(jí)厚的黃色面包服恬惯,還有圍巾等等裝備向拆,看上去...
    林周五閱讀 205評(píng)論 3 1
  • 你是我的往昔浓恳, 我是你的將來(lái)刹缝。 生死咫尺, 如此殘忍的存在颈将。 植物的倔強(qiáng)是柔軟梢夯, 破壁而出, 是紅的心晴圾,綠的命颂砸。 ...
    葉子飄飄吧閱讀 1,492評(píng)論 11 10