导读
本文主要是对connect-history-api-fallback库进行一次源码分析。connect-history-api-fallback是一个用于支持SPA History路由模式的nodejs库。阅读本文前,应对HTML5 History模式有一定程度的了解!
源码分析
'use strict';
var url = require('url');
exports = module.exports = function historyApiFallback(options) {
// 接收配置参数
options = options || {};
// 初始化日志管理器
var logger = getLogger(options);
// 中间件是要返回一个函数的,函数形参有req, res, next
return function(req, res, next) {
var headers = req.headers;
if (req.method !== 'GET') {
// 如果请求方法不是GET类型,说明不需要返回html,那么就调用next(),把请求交给下一个中间件
logger(
'Not rewriting',
req.method,
req.url,
'because the method is not GET.'
);
return next();
} else if (!headers || typeof headers.accept !== 'string') {
// 如果没有请求头,或者请求头中的accept不是字符串,说明不是一个标准的http请求,也不予处理,把请求交给下一个中间件
logger(
'Not rewriting',
req.method,
req.url,
'because the client did not send an HTTP accept header.'
);
return next();
} else if (headers.accept.indexOf('application/json') === 0) {
// 如果客户端希望得到application/json类型的响应,说明也不是在请求html,也不予处理,把请求交给下一个中间件
logger(
'Not rewriting',
req.method,
req.url,
'because the client prefers JSON.'
);
return next();
} else if (!acceptsHtml(headers.accept, options)) {
// 如果请求头中不包含配置的Accept或者默认的['text/html', '**'];
for (var i = 0; i < options.htmlAcceptHeaders.length; i++) {
if (header.indexOf(options.htmlAcceptHeaders[i]) !== -1) {
return true;
}
}
return false;
}
// 处理日志
function getLogger(options) {
if (options && options.logger) {
// 如果有指定的日志方法,则使用指定的日志方法
return options.logger;
} else if (options && options.verbose) {
// 否则,如果配置了verbose,默认使用console.log作为日志方法
return console.log.bind(console);
}
// 否则就没有日志方法,就不记录日志咯
return function(){};
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持考高分网。



