我正在尝试将自定义中间件路由添加到现有的Loopback应用程序中,但是使用我的本地域映射看到了奇怪的错误,但是在localhost:3000上一切正常。
我的设置是使用
将nginx用作代理服务器location /api {
proxy_pass http://localhost:3000;
}
我在Add a custom Express Route文档页面添加了示例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
我的应用程序和/ api相同的域代理在AngularJS调用时适用于应用程序,但是当通过https://domain.com/api/ping,调用时,我似乎无法获得自定义Express路由。当我使用http://localhost:3000/ping时,它可以正常工作。
使用http://localhost:3000/ping
我
但是在nginx ssl代理上使用完整的模拟域,它不会采用相同的路径:
{
"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"
}
}
这是预期的行为吗?我怎样才能让两者相等?这似乎是两个问题
UPDATE 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;
}
}
}
答案 0 :(得分:1)
这似乎不是Loopback特定的问题,但更多与Nginx及其设置有关。要验证这一点,请尝试在Node.js中创建一个简单的Hello World应用程序,以查看是否收到相同的错误。
答案 1 :(得分:1)
您可能希望在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
param更改为不是全局的,只需使用/api
但处理相同。诀窍是Loopback config host
param必须匹配nginx config上游声明的主机。