通過express搭建自己的服務器

分類:IT技術 時間:2017-09-30

前言

為了模擬項目上線,我們就需要一個服務器去提供API給我們調用數據。這次我采用express框架去寫API接口。所有請求都是通過ajax請求去請求服務器來返回數據。第一次用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參數模塊
var path = require('path');  文件路徑模塊
var bodyParser = require('body-parser'); 請求體對象化 (必須)否則後臺無法解析前端發送的body內容

接下來直接啟用模塊

app.use(bodyParser.json());

// 訪問靜態資源文件 這裏是訪問所有dist目錄下的靜態資源文件
app.use(express.static(path.resolve(__dirname, '../dist')))
app.use(express.static('public'));

// 因為是單頁應用 所有請求都走/dist/index.html
app.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();
});

準備工作做完可以開始動手寫接口了。關於數據庫可以模擬一個json,也可以真實模擬上線數據庫。關於本文設計的mongodb數據庫,有興趣可以看我的另一篇文章

快速搭建屬於自己的數據庫——mongodb

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

數據庫連接

這裏我假設你已經安裝了mongodb數據庫並成功啟用。仔細閱讀express教程你會發現框架提供了對mongodb的支持,mongodb有非常多的擴展插件去使用該數據庫 比如mongoose。這裏我們使用express官方提供的mongoskin來鏈接數據庫。

$ 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);
});

安裝成功後 ,我們就首先把使用的數據庫引入,代碼如下

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

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

對前端發送的請求進行處理

處理get請求

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

以上代碼就實現了對一個get請求的處理,通過參數模塊獲取了url的參數,db也就是已經連接的數據庫。根據ID對‘articleList’的數據表進行搜索,處理完畢後 通過res.end()返回數據結束響應。

處理post請求

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

post請求的參數獲取和get不同 可以直接通過req.body去獲取前端傳輸的請求體。通過js對象的方式去獲取參數。然後根據參數執行數據庫操作。到此,基本的請求也就介紹完畢了。下面說下怎麽處理圖片的上傳此類常見的文件操作需求。

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

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

var multer  = require('multer');
var storage = multer.diskStorage({
  //設置上傳後文件路徑,uploads文件夾會自動創建。
  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調用
var upload = multer({
  storage: storage
}).single('file');

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

/**
 * 圖片上傳
 */
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))
  })
});

//圖片上傳到服務器 ,向客戶端返回文件信息
   比如文件的存儲位置,之後就可以通過地址訪問服務器的圖片

/**
 * 圖片刪除
 */
app.post('/image/delete', function (req, res) {
  fs.unlink(req.body.path, function(err) {
    if (err) {
      return console.error(err);
    }
    res.end("文件刪除成功!");
  });
});

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

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

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

以上我們如果在本地跑項目基本已經可以沒問題。但項目上線後一刷新。啊啦??404什麽鬼?打開百度一查。那爐火多~~當前端啟用hisory模式,後臺也必須開啟對history的支持。express 環境如下:

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

更新代碼刷新~OK 完美!

總結

想學好一樣東西,需要長久的積累。作為一個前端,一些服務器數據庫的知識除了可以幫助我們更好的跟兄弟(後端)交流,對前端來說也是如魚得水一般的存在。
下一篇文章準備寫electron入門,electron是通過js構建桌面應用的框架,。共勉~~~~~

全部源碼都在我的博客之中,對我的博客源碼有興趣,可以fork一份自行研究

如果覺得本文對你有所幫助,就star一下吧~大傳送之術! 我的博客Github


Tags: 039 require 模塊 請求 express 文件

文章來源:


ads
ads

相關文章
ads

相關文章

ad