我正在尝试向现有的Loopback应用程序添加一个自定义中间件路由,但是使用本地域映射可以看到奇怪的错误,但是在localhost:3000上一切正常。
我的安装程序使用nginx作为代理服务器,使用
location /api {
proxy_pass http://localhost:3000;
}
我从添加自定义快车路线文档页面添加了示例server/boot/aroutes.js文件:
module.exports = function(app) {
// Install a "/ping" route that returns "pong"
app.get('/ping', function(req, res) {
res.send('pong');
});
}
我的服务器/引导看起来是这样的,所以aroutes.js首先是字母顺序的:
server/boot/
aroutes.js
authentication.js
rest-api.js
当被AngularJS调用时,我的应用程序和AngularJS相同的域代理可以正常工作,但是当通过https://domain.com/api/ping调用时,我似乎无法获得一个自定义的快捷路线,但是当我使用http://localhost:3000/ping时,它工作得很好。
使用http://localhost:3000/ping
我得到
但是,使用nginx代理上的完整模拟域,它不采用相同的路由:
{
"error": {
"name": "Error",
"status": 404,
"message": "There is no method to handle GET /ping",
"statusCode": 404,
"stack": "Error: There is no method to handle GET /ping
at restUrlNotFound (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/strong-remoting/lib/rest-adapter.js:332:17)
at Layer.handle [as handle_request] (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/layer.js:82:5)
at trim_prefix (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:302:13)
at /Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:270:7
at Function.proto.process_params (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:321:12)
at next (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:261:10)
at jsonParser (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/body-parser/lib/types/json.js:96:40)
at Layer.handle [as handle_request] (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/layer.js:82:5)
at trim_prefix (/Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:302:13)
at /Users/notbrain/src/proteus/node_modules/loopback/node_modules/express/lib/router/index.js:270:7"
}
}
这是预期的行为吗?我怎么才能让这两者成为等价物呢?看上去有两个问题
更新6/24:这里使用的更显式的nginx配置:
http {
# ...snip logging etc... #
upstream api {
# loopback api on port 3000
server localhost:3000;
}
upstream app {
# browser-sync frontend for dev on port 3001
server localhost:3001;
}
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
server_name dev.app.proteus.com;
ssl_certificate ssl/dev.app.proteus.com.crt;
ssl_certificate_key ssl/dev.app.proteus.com.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
# ----- PFS ----- #
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA RC4 !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS";
location / {
# proxy_pass to connect server spawned by gulp browserSync ------------
proxy_pass http://app;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
location /api {
proxy_pass http://api;
}
}
}
发布于 2015-06-15 21:27:34
这似乎不是一个回溯特定的问题,但更多有关的Nginx和它的设置。要验证这一点,请尝试在Node.js中创建一个简单的Hello应用程序,看看是否有相同的错误。
发布于 2015-06-22 23:47:19
您可能希望在nginx中使用upstream
。
在该环境的回送配置中,将host
参数更改为服务器名。然后,在您的nginx配置上游,而不是localhost:{port}
,改为相同的服务器名。
例如,在用于测试环境的server/config.test.js
(启动服务器之前的export NODE_ENV=test
)中,可以覆盖默认主机:
module.exports = {
host: "app3",
...
}
然后,在您的etc/nginx/conf.d/{app-name}.conf
文件中(很好地为每个应用程序创建一个),您可以拥有如下内容:
upstream my-app {
server app3:3000;
}
server {
listen 80;
server_name your-server-domain.com;
# custom handlers for internal apps
# add stuff as needed below
#
location ^~ / {
proxy_set_header HOST $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://my-app;
}
}
现在,您可以始终将location
参数更改为非全局的,只使用/api
,而使用相同的处理。诀窍是,Loopback配置host
param必须与在nginx上游声明的主机匹配。
https://stackoverflow.com/questions/30793622
复制相似问题