国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > JS > 正文

node通過express搭建自己的服務(wù)器

2024-05-06 16:40:06
字體:
供稿:網(wǎng)友

前言

為了模擬項目上線,我們就需要一個服務(wù)器去提供API給我們調(diào)用數(shù)據(jù)。這次我采用express框架去寫API接口。所有請求都是通過ajax請求去請求服務(wù)器來返回數(shù)據(jù)。第一次用node寫后端,基本就是摸著石頭的過河,文中有什么不足不處歡迎指出。

安裝express框架

傳送門: express官方

然后介紹一下需要引入的中間件,node本身提供了一些庫。我們可以直接通過require去引用,對于未提供的庫,我們也可以通過手動npm去安裝

var fs = require('fs'); 操作文件模塊var http = require('http'); http模塊var url = require('url');  獲取url信息模塊var qs = require('querystring'); 處理url參數(shù)模塊var path = require('path'); 文件路徑模塊var bodyParser = require('body-parser'); 請求體對象化 (必須)否則后臺無法解析前端發(fā)送的body內(nèi)容

接下來直接啟用模塊

app.use(bodyParser.json());// 訪問靜態(tài)資源文件 這里是訪問所有dist目錄下的靜態(tài)資源文件app.use(express.static(path.resolve(__dirname, '../dist')))app.use(express.static('public'));// 因為是單頁應(yīng)用 所有請求都走/dist/index.htmlapp.get('/', function(req, res) { const html = fs.readFile(path.resolve(__dirname, '../dist/index.html'), 'utf-8'); res.send(html)});//處理請求跨域app.all('*', function(req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); res.header("Content-Type", "application/json;charset=utf-8"); res.header("Access-Control-Allow-Headers", "content-type"); next();});

準(zhǔn)備工作做完可以開始動手寫接口了。關(guān)于數(shù)據(jù)庫可以模擬一個json,也可以真實模擬上線數(shù)據(jù)庫。

下面會劃成3塊說明——數(shù)據(jù)庫的對接、請求的操作、文件請求的操作。

數(shù)據(jù)庫連接

這里我假設(shè)你已經(jīng)安裝了mongodb數(shù)據(jù)庫并成功啟用。仔細閱讀express教程你會發(fā)現(xiàn)框架提供了對mongodb的支持,mongodb有非常多的擴展插件去使用該數(shù)據(jù)庫 比如mongoose。這里我們使用express官方提供的mongoskin來鏈接數(shù)據(jù)庫。

$ npm install mongoskin#####官方實例var db = require('mongoskin').db('localhost:27017/animals');db.collection('mamals').find().toArray(function(err, result) { if (err) throw err; console.log(result);});

安裝成功后 ,我們就首先把使用的數(shù)據(jù)庫引入,代碼如下

var db = require('mongoskin').db('mongodb://localhost:27017/blog');var ObjectId = require('mongodb').ObjectID;

以上代碼表示我們成功連接了blog數(shù)據(jù)庫并且啟用了私有ID,objectID是mongodb生成數(shù)據(jù)自動添加的ID。可以直接拿來用。到這里數(shù)據(jù)庫和服務(wù)器就已經(jīng)對接完畢了。

對前端發(fā)送的請求進行處理

處理get請求

/** * 獲取文章信息 */app.get('/article/info', function (req, res) { >>> 獲取請求參數(shù) var arg = qs.parse(url.parse(req.url).query); var id = arg.id; >>> 鏈接數(shù)據(jù)庫根據(jù)參數(shù)查找文檔并返回 db.collection('articleList').find({ "_id": ObjectId(id)}).toArray(function(err, result) {  if (err) throw err;  console.log(result)  res.end(JSON.stringify(result)) });});

以上代碼就實現(xiàn)了對一個get請求的處理,通過參數(shù)模塊獲取了url的參數(shù),db也就是已經(jīng)連接的數(shù)據(jù)庫。根據(jù)ID對‘articleList'的數(shù)據(jù)表進行搜索,處理完畢后 通過res.end()返回數(shù)據(jù)結(jié)束響應(yīng)。

處理post請求

/** * 提交留言信息 */app.post('/board/post', function (req, res) { >>>> 獲取請求參數(shù) var data = {  date: req.body.date,  name: req.body.name,  content: req.body.content,  time: req.body.time,  position: req.body.position };  >>> 鏈接數(shù)據(jù)庫并插入數(shù)據(jù)  db.collection('board').insert(data, function(err, result) {  if(err) {   res.end('Error:'+ err)  }  res.end('提交成功') });});

post請求的參數(shù)獲取和get不同 可以直接通過req.body去獲取前端傳輸?shù)恼埱篌w。通過js對象的方式去獲取參數(shù)。然后根據(jù)參數(shù)執(zhí)行數(shù)據(jù)庫操作。到此,基本的請求也就介紹完畢了。下面說下怎么處理圖片的上傳此類常見的文件操作需求。

對前端的文件請求進行處理

為了簡化操作,我們可以引入multer模塊來處理文件,代碼如下

var multer = require('multer');var storage = multer.diskStorage({ //設(shè)置上傳后文件路徑,uploads文件夾會自動創(chuàng)建。 destination: function (req, file, cb) {  cb(null, './public/uploads') }, //給上傳文件重命名,獲取添加后綴名 filename: function (req, file, cb) {  var fileFormat = (file.originalname).split(".");  cb(null, file.fieldname + '-' + Date.now() + "." + fileFormat[fileFormat.length - 1]); }});//生成上傳模塊,讓API調(diào)用var upload = multer({ storage: storage}).single('file');

以上代碼就成功引入了文件上傳模塊,通過該模塊我們可以快速生成相應(yīng)內(nèi)容,具體使用方法可以查看官方文檔。準(zhǔn)備工作完成后,在項目中使用:

/** * 圖片上傳 */app.post('/upload', function (req, res) { upload(req, res, function (err) {  if (err) {   console.log(err)   return  }  console.log(req.file)  res.end(JSON.stringify(req.file)) })});//圖片上傳到服務(wù)器 ,向客戶端返回文件信息  比如文件的存儲位置,之后就可以通過地址訪問服務(wù)器的圖片/** * 圖片刪除 */app.post('/image/delete', function (req, res) { fs.unlink(req.body.path, function(err) {  if (err) {   return console.error(err);  }  res.end("文件刪除成功!"); });});

這里上傳圖片我們就直接使用了直接之前已經(jīng)寫好的upload模塊,當(dāng)該接口請求成功時 ,文件就已經(jīng)上傳成功了,如果你需要一個預(yù)覽過程,那不應(yīng)該直接調(diào)用上傳接口 。通過原生node fs模塊 我們也能對添加的文件進行刪除,修改操作。

上線以及上線后遇到的history模式的刷新問題

上線過程我們可以當(dāng)作就是換一臺電腦跑程序,這里我用的是阿里云的服務(wù)器。在云服務(wù)器安裝好環(huán)境好,把項目克隆進去 ,再裝個forever之類的永久運行庫,start ~ok 這樣你的項目就永遠在運行了。如果需要www訪問 ,還需要買個dns解析 和域名,指向你的服務(wù)器。

以上我們?nèi)绻诒镜嘏茼椖炕疽呀?jīng)可以沒問題。但項目上線后一刷新。啊啦??404什么鬼?打開百度一查。那爐火多~~當(dāng)前端啟用hisory模式,后臺也必須開啟對history的支持。express 環(huán)境如下:

var history = require('connect-history-api-fallback');var connect = require('connect');///////app.use(history());

更新代碼刷新~OK 完美!

總結(jié)

想學(xué)好一樣?xùn)|西,需要長久的積累。作為一個前端,一些服務(wù)器數(shù)據(jù)庫的知識除了可以幫助我們更好的跟兄弟(后端)交流,對前端來說也是如魚得水一般的存在。

下一篇文章準(zhǔn)備寫electron入門,electron是通過js構(gòu)建桌面應(yīng)用的框架,。共勉~~~~~

Github:https://github.com/xu455255849/myBlog

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持VeVb武林網(wǎng)。


注:相關(guān)教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 顺义区| 阿克苏市| 汾西县| 海安县| 广灵县| 鞍山市| 油尖旺区| 宜宾县| 梅州市| 新巴尔虎右旗| 图木舒克市| 思南县| 崇文区| 宾阳县| 玛曲县| 普格县| 原阳县| 马鞍山市| 永福县| 永康市| 印江| 仪陇县| 延安市| 巴塘县| 锡林郭勒盟| 东辽县| 确山县| 龙里县| 溆浦县| 汕尾市| 登封市| 水富县| 丹凤县| 陵水| 松桃| 措美县| 林甸县| 兴海县| 扶余县| 湘西| 新巴尔虎右旗|