Mik*_*ail 5 proxy json nginx node.js express
我正在运行一个 NginX 服务器,该服务器托管在“pocket-caravan.com”的 Digital Ocean Droplet 上。
目标是构建链接到所有 css/js/images 的 React 包,并使用 nginx 处理静态内容服务。API 服务器是一个在某个端口上运行的 Express 应用程序,我将来自静态包的所有请求代理到此。
当我在本地开发时,我可以从前端将 JSON 数据发送到我的 API。
当我部署 API 时,我可以通过 Postman 发送 JSON 有效负载
但问题是,当我通过访问 NginX 提供的静态文件来访问我的应用程序,并向实时 API 发送 POST 请求时,该文件req.body是空的!
我可以检查 JS 控制台并看到提取请求正确发送 JSON 数据正文。
请求正确路由到实时 API,但数据为空!NginX 代理不传递请求正文,我不知道为什么?
我有一个问题 - 虽然我可以访问所有静态文件,但我的 API 请求正在被代理并正确路由到 API,但是当 Express 访问时req.body,它是空的!
/etc/nginx/sites-available/pocket-caravan.com
server {
root /var/www/pocket-caravan.com/html;
index index.html index.html index.nginx.debian.html;
server_name pocket-caravan.com www.pocket-caravan.com;
location /omni-commerce {
index index.html;
}
location /static {
try_files /omni-commerce/$uri /omni-commerce/$uri/;
}
location /api {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header Connection 'upgrade';
access_log /var/www/pocket-caravan.com/logs/logs.txt;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/pocket-caravan.com/fullchain.pem; # m$
ssl_certificate_key /etc/letsencrypt/live/pocket-caravan.com/privkey.pem; #$
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.pocket-caravan.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = pocket-caravan.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name pocket-caravan.com www.pocket-caravan.com;
return 404; # managed by Certbot
}
Run Code Online (Sandbox Code Playgroud)
重现这个问题:
我访问我的应用程序:
https://pocket-caravan.com/omni-commerce/
发送 POST 请求
https://pocket-caravan.com/api/register?pathway=marketplace
JSON 数据示例: { "firstName": "foo", "lastName": "bar", "email": "foo@bar.com", "password": "123123"
}
Express App 运行在端口 3001:
server {
root /var/www/pocket-caravan.com/html;
index index.html index.html index.nginx.debian.html;
server_name pocket-caravan.com www.pocket-caravan.com;
location /omni-commerce {
index index.html;
}
location /static {
try_files /omni-commerce/$uri /omni-commerce/$uri/;
}
location /api {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
proxy_set_header Connection 'upgrade';
access_log /var/www/pocket-caravan.com/logs/logs.txt;
}
listen [::]:443 ssl ipv6only=on; # managed by Certbot
listen 443 ssl; # managed by Certbot
ssl_certificate /etc/letsencrypt/live/pocket-caravan.com/fullchain.pem; # m$
ssl_certificate_key /etc/letsencrypt/live/pocket-caravan.com/privkey.pem; #$
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
}
server {
if ($host = www.pocket-caravan.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
if ($host = pocket-caravan.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
listen 80;
listen [::]:80;
server_name pocket-caravan.com www.pocket-caravan.com;
return 404; # managed by Certbot
}
Run Code Online (Sandbox Code Playgroud)
当我将请求发送到时,这在 localhost - webpackdevserver 上工作得很好https://pocket-caravan.com/api/register?pathway=marketplace
但是,当部署的构建代码由代理请求的同一 NginX 服务器提供服务时,Express 无法访问请求正文。
我对 NginX 的了解不够,无法继续调试,我似乎无法记录请求正文,我真的很感激任何帮助!
以下是网络面板中有关失败请求的信息:(由于 req.body.email 未定义并导致中间件崩溃,因此抛出 500)
General
Request URL: https://pocket-caravan.com/api/register?pathway=omni
Request Method: POST
Status Code: 500 Internal Server Error
Remote Address: 67.205.154.96:443
Referrer Policy: no-referrer-when-downgrade
Response Headers
Access-Control-Allow-Credentials: true
Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization, Set-Cookie
Access-Control-Allow-Methods: POST, GET, OPTIONS, DELETE, PUT
Access-Control-Allow-Origin: https://pocket-caravan.com
Connection: keep-alive
Content-Length: 1633
Content-Type: application/json; charset=utf-8
Date: Wed, 08 Jan 2020 08:52:16 GMT
ETag: W/"661-PIPnVrxYNILoG0ylml9L0Camw1w"
Server: nginx/1.14.0 (Ubuntu)
Strict-Transport-Security: max-age=15552000; includeSubDomains
X-Content-Type-Options: nosniff
X-DNS-Prefetch-Control: off
X-Download-Options: noopen
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
Request-Headers
Accept: application/json
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Content-Length: 94
Content-Type: text/plain;charset=UTF-8
Cookie: Stuff=random--!; Authorization-Omni=sec0ret%20encu0ingdgin
DNT: 1
Host: pocket-caravan.com
Origin: https://pocket-caravan.com
Referer: https://pocket-caravan.com/omni-commerce/
Sec-Fetch-Mode: no-cors
Sec-Fetch-Site: same-origin
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.117 Safari/537.36
pathway: omni
{firstName: "asdasda", lastName: "asdas", email: "asdasd@adsda.com", password: "asdasdsdasd"}
firstName: "asdasda"
lastName: "asdas"
email: "asdasd@adsda.com"
password: "asdasdsdasd"
Run Code Online (Sandbox Code Playgroud)
我解决了这个问题。很简单。我未能将正确的“Content-Type”标头传递给代理。我查看了请求输出,并在期望传递 JSON 时看到了这一点:
Content-Type: text/plain;charset=UTF-8
Express body-parser/json-parser 没有解析正文,也没有将其传递给req.body.
将其添加到我的/api代理处理程序中修复了一些问题:
proxy_set_header content-type "application/json";
location /api {
proxy_pass http://localhost:3001;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header content-type "application/json";
proxy_cache_bypass $http_upgrade;
proxy_set_header Connection 'upgrade';
access_log /var/www/pocket-caravan.com/logs/logs.txt;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
18394 次 |
| 最近记录: |