簡介
可以作爲使用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": "*"
}
}