前言
使用javascript就可以給自己搭建一個(gè)服務(wù)器磷支,還沒(méi)配置node環(huán)境的可以看我的一篇文章windows如何快速的搭建node環(huán)境选侨,該文章篇幅較長(zhǎng)鱼鼓,請(qǐng)細(xì)心閱讀
用途
- 展示個(gè)人主頁(yè)以及其他的網(wǎng)頁(yè)
- 靜態(tài)資源(可以這樣訪(fǎng)問(wèn) http://localhost:3000/static/images/head.jpg)
- 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)目的配置信息
具體分析
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)重啟
- 全局安裝nodemon插件晾嘶,還沒(méi)配置淘寶鏡像的建議先配置淘寶鏡像 http://npm.taobao.org/
cnpm install nodemon -g
- 在此目錄打開(kāi)命令行
nodemon app.js
4 瀏覽器打開(kāi)http://localhost:3000/訪(fǎng)問(wèn)主頁(yè)
-
瀏覽器輸入http://localhost:3000/api/postlist來(lái)查看返回的json數(shù)據(jù)
-
瀏覽器輸入http://localhost:3000/static/images/head.jpg來(lái)查看自己的靜態(tài)文件(當(dāng)然你得有這個(gè)文件,圖片娶吞,樣式垒迂,腳本)
擴(kuò)展
- 擴(kuò)展其他頁(yè)面(如about頁(yè)面)
// app.js
var about = require('./routes/about');
app.get('/about', about);
- 擴(kuò)展api接口
// app.js
var userinfo= require('./apis/userinfo');
app.get('/api/userinfo', userinfo); // get query方式
app.get('/api/userinfo/:uid', userinfo);// get params方式
- 各種情況下參數(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)
- 購(gòu)買(mǎi)云主機(jī)绣夺,配置好(騰訊云吏奸,阿里云等)
- 復(fù)制項(xiàng)目到云主機(jī)(配置node環(huán)境),然后運(yùn)行
- 通過(guò)ip地址訪(fǎng)問(wèn)項(xiàng)目(http://119.29.73.229)
- 如果你的主機(jī)綁定了域名(http://www.xxx.com)
- 如果你有https證書(shū)(https://www.xxx.com)
- 如果你不把端口改為80陶耍,而是其他(http://www.xxx.com:3000)奋蔚,這樣會(huì)很難看
- 當(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)注
哦 ??
微信公眾號(hào)
「前端宇宙情報(bào)局」
,將不定時(shí)更新最新酗钞、實(shí)用的前端技巧/技術(shù)性文章腹忽,歡迎關(guān)注,一起學(xué)習(xí) ??