一, 概述
通過express搭建http服務。
1. express4
× express
× serve-favicon 處理favicon
× morgan 日志系統
× method-override 處理PUT/DELETE請求,目前沒有用到
× express-session 處理session
× body-parser 處理post提交的body。
× multer 處理文件上傳。
× errorhandler 錯誤處理
2. jade 模板引擎
3. easyui 前端架構
二, 功能:
1. 登錄頁面
2. 登錄校驗,校驗是否登錄,如果登錄將用戶信息保存至session。
3. 主頁,使用easyui layout布局。
三, 代碼分析:
1. server.js
var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var methodOverride = require('method-override');
var session = require('express-session');
var bodyParser = require('body-parser');
var multer = require('multer');
var errorHandler = require('errorhandler');
// self define js library
var router = require("./server/router.js");
var app = express();
// all environments
app.set('port', process.env.PORT || 18080);
app.set('views', path.join(__dirname, 'jade'));
app.set('view engine', 'jade');
app.use(favicon(path.join(__dirname, 'static/favicon.ico')));
app.use(logger('dev'));
app.use(methodOverride());
app.use(session({ resave: true,
saveUninitialized: true,
secret: 'uwotm8' }));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(multer());
app.use(express.static(path.join(__dirname, 'static'))); //靜態頁面地址
// development only
if ('development' == app.get('env')) {
app.use(errorHandler());
}
// 注冊url以及url handler
router.register(app);
app.listen(app.get('port'), function(){
console.log('Express server listening on port ' + app.get('port'));
});2. router.js path注冊頁面
var url = require("url");
var merge = require("merge");
var router = {};
var serverConfig = require("../server.json");
// 指示是否啟動登錄校驗。
var VALIDATE_LOGIN = true;
/**
* string-function|object
* function: see object handler
* object {
* type: html(default) | json,
* method: get(default) | post
* handler: function(req, res)
* }
* @type {{/: indexController, /index.html: indexController, detail.html: {handler: detailController}}}
*/
var htmlPath = {
"/": indexController,
"/index.html": indexController,
"/list.html" : listController
};
var codePath = {
"NOT_LOGIN" : {
code: -100,
message: "當前用戶未登錄!"
},
"FAIL": {
code: -1,
message: "操作失敗!"
},
"SUCCESS" : {
code: 1,
message: "操作成功!"
},
"LOGIN_SUCCESS" : {
code: 100,
message: "登錄成功!"
}
};
router.register = function(app){
app.use(function(req, res, next){
if(!VALIDATE_LOGIN){
next();
}
else{
var type = isIntercept(req);
if(type == "json"){
res.json(codePath["NOT_LOGIN"]);
}
else if(type=="html"){
res.redirect("/login.html?url=" + encodeURIComponent(req.url))
}
else{
next();
}
}
});
var key, value;
for(key in htmlPath){
value = htmlPath[key];
if(typeof(value)=="function"){
app.get(key, value);
}
else if(typeof(value)=="object" && typeof(value.handler)){
if(value.method=="post"){
app.post(key, value.handler);
}
else{
app.get(key, value.handler);
}
}
}
app.get("/login.html", login1);
app.post("/doLogin.html", login2);
};
function indexController(req, res){
res.render("index", getServerConfig());
}
function listController(req, res){
var obj = {message: req.param("message")};
res.render("list", getServerConfig(obj));
}
function login1(req, res){
res.render("login", getServerConfig());
}
function login2(req, res){
var username = "", password = "";
var ret = "";
var obj = {};
if(req.body){
username = req.body.username;
password = req.body.password;
if(req.session){
req.session.username = username;
req.session.password = password;
}
}
if(username && password){
if(req.session){
req.session.uid = username;
}
res.json(codePath["LOGIN_SUCCESS"])
}
else{
res.json(codePath["FAIL"]);
}
}
function isIntercept(req){
var pp = url.parse(req.url).pathname;
var value = htmlPath[pp];
if(value){
if(req.session && req.session.uid){
return "";
}
if(typeof(value)=="function"){
return "html";
}
else if(typeof(value)=="object"){
return value.type || "html";
}
}
return "";
}
function getServerConfig(obj){
return merge({}, {server: serverConfig}, obj);
}
module.exports = router;四, 截圖
本站文章版權歸原作者及原出處所有 。內容為作者個人觀點, 并不代表本站贊同其觀點和對其真實性負責,本站只提供參考并不構成任何投資及應用建議。本站是一個個人學習交流的平臺,網站上部分文章為轉載,并不用于任何商業目的,我們已經盡可能的對作者和來源進行了通告,但是能力有限或疏忽,造成漏登,請及時聯系我們,我們將根據著作權人的要求,立即更正或者刪除有關內容。本站擁有對此聲明的最終解釋權。