Express4 + MongoDB 服務端搭建

簡介

可以作爲使用Nodejs進行前後端分離開發時,後端服務器搭建基本過程的參考。習慣閱讀代碼的可以直接跳到文末進行閱讀

前序條件、基本環境

    需要 nodeJS 環境、MongoDB環境
    執行 npm install -g express-generator@4 安裝express4
    執行 npm install -g supervisor 安裝一個工具,用於自動重啓,並應用代碼(可選)

生成基本框架

在工程目錄上一級執行以下命令,用於自動生成工程目錄以及相關的基本文件

express -e home

 因爲是前後端分離,所以生成的 view 文件夾都沒用了,可以移除(public目錄下提供靜態文件服務的子目錄也可以選擇性刪除),但是移除後需要修改 app.js 中關於 view 的處理,即刪除 view 配置、使用部分的代碼。否則會報錯,文末會給出相關代碼。

修改 package.json ,修改啓動命令爲 supervisor ./bin/www 如果安裝了 supervisor 的話可以使用,將 "mongoose": "*" 添加到 dependencies 中。命令行進入工程目錄,執行下列命令安裝依賴包:

npm install

 安裝完成後,在工程目錄下執行下列命令啓動程序

npm start

 現在訪問在瀏覽器 http://127.0.0.1:3000/stylesheets/style.css 可以得到正確文件內容,到這裏,基本框架整完了。(因爲刪除了view,無法訪問頁面,如果連這個 css 文件也一併刪除了的話,報錯是正常的)

配置返回 JSON

這裏使用 json 作爲返回給前端的數據格式。其實就是在路由規則的函數中調用 res.json() 方法,將需要作爲 json 返回的 js 對象作爲參數進行傳入,順便處理一下原有的錯誤處理即可。

在 index.js 中修改路由到 ‘/’ 的 get 請求,使之直接返回一個對象,以測試配置的效果,代碼如下

router.get('/', function (req, res, next) {

  res.json(Result.Success('接口測試'));

});

因爲對返回數據有固定的格式需求,這裏將 json 響應封裝爲一個類,處理一些重複的操作。完成處理後,待程序重啓完畢直接在瀏覽器訪問 http://127.0.0.1:3000 和一個任意不存在的路徑,得到如下結果,響應的字符串爲 json 字符串,可說明 json 的配置成功,404 訪問的信息需要在修改默認的錯誤處理。

 MongoDB連接、測試

這裏使用了 mongoose 進行數據庫連接,具體使用方法這裏不做說明。

建立連接、建立實體類,比如這裏使用的是 Bookmark ,創建一個保存到數據庫的方法,代碼如下

let mongoose = require('mongoose')

mongoose.connect('mongodb://ip/數據庫名')  // 建立連接

// 定義實體
let bookmarkModel = mongoose.model('Bookmark', new mongoose.Schema({
  key: String,
  pwd: String
}, {
  collection: 'home'
}))

// 用於測試的方法,保存實體到數據庫
let save = function(key, pwd) {
  let newBookMark = {key, pwd};
  newBookMark = new bookmarkModel(newBookMark);
  newBookMark.save();
}

在 index.js 中定義一個路由,調用這個方法,向定義的路由發送 post 請求進行測試,得到下圖所示結果,前端收到了正確的相應,且數據庫中生成了指定的數據,說明配置正確,至此數據庫連接配置完成,可以進行後續開發。

相關代碼 

本實例中,工程根目錄爲 home。

  • /home/entity

// /home/entity/bookmark.js: 測試用實體

let mongoose = require('./../util/mongodb')

let bookmarkModel = mongoose.model('Bookmark', new mongoose.Schema({
  key: String,
  pwd: String
}, {
  collection: 'home'
}))

module.exports = {
  save(key, pwd) {
    let newBookMark = {key, pwd};
    if(typeof (key) === 'object')  // 如果第一個參數是對象,則保存該對象
      newBookMark = key;
    newBookMark = new bookmarkModel(newBookMark);
    newBookMark.save();
    return Promise.resolve();  // 用於異步處理
  }
}
// /home/entity/ersult.js:Json 響應實體

module.exports = class Result{
  constructor(status=200, info='當前接口無說明信息', obj=null){
    this.status = status
    this.info = info
    this.obj = obj
  }

  static Success = (info, obj=null) => new Result(200, info, obj)
}
  • /home/routes

// /home/routes/index.js: 路由處理

var express = require('express');
var router = express.Router();
var Result = require('./../entity/result');
var bookmarks = require('./../entity/bookmark')
const crypto = require('crypto') // 生成散列值以加密密碼

/* GET home page. */
router.get('/', function (req, res, next) {
  res.json(Result.Success('接口測試'));
});

router.post('/save', function (req, res) {
  const md5 = crypto.createHash('md5');
  const pwd = md5.update(req.body.pwd).digest('hex');  // 用於md5密碼加密
  const key = req.body.key;
  bookmarks.save(key, pwd).then(() => res.json(Result.Success('保存成功')))
})

module.exports = router;
  • /home/util

// /home/util/mongodb.js: 數據庫連接工具

// 建立數據庫連接

let config = require('./config')  // 全局配置,代碼見本段結尾註釋
let mongoose = require('mongoose')

mongoose.connect(config.dbLink, {
  useNewUrlParser: true,  // 處理兩個警告
  useUnifiedTopology: true
})

module.exports = mongoose

/* /home/util/config.js

module.exports = {
  dbLink: 'mongodb://localhost/home'
}
*/
  • /home/app.js

// /home/app.js

var createError = require('http-errors');
var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var indexRouter = require('./routes/index');

var Result = require('./entity/result');
var app = express();

// view engine setup, 去除原 view 配置
// app.set('views', path.join(__dirname, 'views'));
// app.set('view engine', 'ejs');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('/', indexRouter);

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  var jsonResult = new Result(err.status || 500, err.message, req.app.get('env') === 'development' ? err : {});
  
  // return data to client
  res.status(err.status || 500);
  res.json(jsonResult);
});

module.exports = app;
  • /home/package.json

{
  "name": "home",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "supervisor ./bin/www"
  },
  "dependencies": {
    "debug": "~2.6.9",
    "express": "~4.16.1",
    "http-errors": "~1.6.3",
    "morgan": "~1.9.1",
    "body-parser": "1.19.0",
    "mongoose": "*"
  }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章