我一直在努力尝试在我的Gruntfile中设置我的代理。这是我的Gruntfile
:
var proxySnippet = require('grunt-connect-proxy/lib/utils').proxyRequest;
module.exports = function(grunt) {
require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
grunt.initConfig({
connect:{
livereload: {
options: {
middleware: function (connect) {
return [proxySnippet];
}
}
},
options: {
port: 9000,
base: 'app',
keepalive: true,
livereload: true
},
proxies: [
{
context: '/public/api',
host: 'localhost',
port: 8182,
https: false,
rewrite: {
'^/public/api': ''
}
}
]
}
});
grunt.registerTask('server', ['less', 'configureProxies', 'connect', 'connect', 'watch', 'open:dev']);
};
当我运行grunt server
时,我只能点击我的代理。如果我尝试点击除代理之外的任何内容,我会得到404
。是什么给了我这个问题?
答案 0 :(得分:5)
使用grunt-connect-proxy设置代理也遇到了很多麻烦。
挖掘grunt-contrib-connect的源代码,我意识到它使用场景后面的nodeJs
Connect框架。
middleware
选项在内部默认使用此功能:
function (connect, options) {
var middlewares = [];
if (!Array.isArray(options.base)) {
options.base = [options.base];
}
var directory = options.directory || options.base[options.base.length - 1];
options.base.forEach(function (base) {
// Serve static files.
middlewares.push(connect.static(base));
});
// Make directory browse-able.
middlewares.push(connect.directory(directory));
return middlewares;
}
这基本上将connect.static
和connect.directory
中间件添加到传递给connect(middlewares)
构造函数的数组中。
知道了,我们可以像这样使用proxy-middleware nodeJs
包:
connect: {
server: {
options: {
port: 9002,
keepalive: true,
middleware: function (connect, options) {
// Proxy all requests to target the local application.
var proxyOptions = require('url').parse('http://localhost:8080/');
proxyOptions.route = '/api';
return [
require('proxy-middleware')(proxyOptions), // Include the proxy first.
connect.static(options.base), // Serve static files.
connect.directory(options.base) // Make empty directories browse-able.
];
}
}
}
}
基本上我们正在向中间件阵列添加中间件。
此新代理中间件会将http://localhost:9002/api/
等任何传入请求转换为http://localhost:8080/