接着第一篇续,自动转发就是浏览器的请求,node接收到后按照request接收的格式原封不动的将内容对应起来,传递给后端。
包含内容有头部(包含了cookie信息),请求参数,请求体,方法和域名、文件等。在这里非常感谢一位朋友的帮助。
在app.js中,路由请求中间件的前面,有一段逻辑如下:
app.use(function(req, res, next) {
var f = (/接口正则/).test(req.path);
if (!f) {
return;
}
req.proxy.request(null, function(err, response, body) {
if (!!err) {
next(err)
} else {
for (var key in response.headers) {
res.set(key, response.headers[key])
}
try {
body = JSON.parse(body)
} catch(e) {
console.error(e);
}
res.send(body);
}
});
});
以上实现的是自动转发请求,当node接收到的请求符合接口规则时,node将请求原封不动的转发出去。
app.use(function(req, res, next) {
req.proxy.request({
method: "GET",
url: "接口地址",
qs: req.query
}, function(err, response, body) {
var data = body;
try {
data = JSON.parse(body);
} catch(e) {
next(e)
}
if (!res.locals.partials) {
res.locals.partials = {}
}
//用全局变量存储,方便渲染模板调用
res.locals.partials.data = data.data;
next();
});
});
以上是针对某些页面,在渲染模板时,需要是使用相同的变量,最典型的就是头部公共部分去获取用户的相关信息。
{
method: “GET",
url: “接口地址",
qs: req.query
}
这里将覆盖转发中proxy中options中相关内容。
真正转发出去的内容见下方:
proxy.js中内容:
var request = require("request");
var fs = require("fs");
function Proxy() {
this.protocol = "http://";
this.host = "api.inner.utuotu.com";
}
Proxy.prototype.request = function(options, callback) {
var _options = {
form: this.req.body,
qs: this.req.query,
method: this.req.method,
url: this.protocol + this.host + this.req.path,
headers: this.req.headers,
}
options = options || {};
for (var k in options) {
_options[k] = options[k];
}
_options.headers.host = this.host;
//转发文件
if (!!this.req.file) {
_options.attachments = [
fs.createReadStream(this.req.file.path)
]
}
request(_options, callback);
}
exports.proxy = Proxy;
下回讲解handlebar模板部分。
网友评论