一, 概述
通过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;四, 截图
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是一个个人学习交流的平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽,造成漏登,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。