Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Angular PWA应用程序获得504(网关超时)调用节点JS/Express API,但仅当从设备运行时_Node.js_Angular_Progressive Web Apps_Angular Service Worker_Http Status Code 504 - Fatal编程技术网

Node.js Angular PWA应用程序获得504(网关超时)调用节点JS/Express API,但仅当从设备运行时

Node.js Angular PWA应用程序获得504(网关超时)调用节点JS/Express API,但仅当从设备运行时,node.js,angular,progressive-web-apps,angular-service-worker,http-status-code-504,Node.js,Angular,Progressive Web Apps,Angular Service Worker,Http Status Code 504,错误 POST 504(网关超时) 错误服务器错误代码:504消息:Http失败响应:504网关超时 说明 在设备上运行此代码时,我遇到504(网关超时)错误。如果在4200上运行“ng serve”,POST请求将起作用。如果在8080上使用“http服务器-p 8080-c-1 dist/test504”运行并使用浏览器进行测试,则该请求也可以工作。我只有在使用http服务器运行并通过Android设备使用Chrome进行测试时才会出现504错误(因此我可以检查正在发生的事情)。我想区别在于

错误

POST 504(网关超时)

错误服务器错误代码:504消息:Http失败响应:504网关超时

说明

在设备上运行此代码时,我遇到504(网关超时)错误。如果在4200上运行“ng serve”,POST请求将起作用。如果在8080上使用“http服务器-p 8080-c-1 dist/test504”运行并使用浏览器进行测试,则该请求也可以工作。我只有在使用http服务器运行并通过Android设备使用Chrome进行测试时才会出现504错误(因此我可以检查正在发生的事情)。我想区别在于服务人员正在代理呼叫,但这并不能帮助我解决问题。此外,直接与Postman测试API,效果良好

需要注意的一点是,504错误发生在亚秒级。它似乎没有在等待什么。它只是立即超时

我已经创建了一个简化的前端和后端,但仍然存在这个问题

角度应用组件.ts

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.803.22
@angular-devkit/build-angular     0.803.22
@angular-devkit/build-optimizer   0.803.22
@angular-devkit/build-webpack     0.803.22
@angular-devkit/core              8.3.22
@angular-devkit/schematics        8.3.22
@angular/cli                      8.3.22
@angular/pwa                      0.803.22
@ngtools/webpack                  8.3.22
@schematics/angular               8.3.22
@schematics/update                0.803.22
rxjs                              6.5.4
typescript                        3.5.1
webpack                           4.39.2

Node JS version is 12.13.1
saveUser()调用在localhost:3000上运行的节点JS/Express API

import { Component } from '@angular/core';
import { HttpClient} from '@angular/common/http';
import { Iuser } from './user';
import { catchError } from 'rxjs/operators';
import { throwError} from 'rxjs';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})

export class AppComponent {
  user: Iuser = {
    email: '',
    firstName: ''
  };
  result: any;

  constructor(private http: HttpClient) {}

  saveUser() {
    let nbr: number;
    let email: string;

    nbr = Math.floor(Math.random() * Math.floor(100));
    email = 'email' + nbr + '@gmail.com';
    this.user.email = email;
    this.user.firstName = 'test';
    console.log('user=', this.user);

    this.postUser(this.user)
    .pipe(
      catchError (this.handleError)
    )
    .subscribe(data => {
      console.log('result=', data);
      this.result =  JSON.stringify(data);
    });
  }

  private postUser(user: Iuser) {
    return this.http.post('http://localhost:3000/api/user', user);
  }

  private handleError(error) {
    let errorMessage = '';
    if (error.error instanceof ErrorEvent) {
        // client-side error
        errorMessage = `Client Error: ${error.error.message}`;
    } else {
        // server-side error
        errorMessage = `Server Error Code: ${error.status}\nMessage: ${error.message}`;
    }
    return throwError(errorMessage);
  }
}
节点JS/Express API

const express = require('express');
const bodyParser = require('body-parser');
const mongoose = require('mongoose');

const User = require('./models/user');

const app = express();

mongoose.connect(process.env.MONGO_CONNECT)
  .then(() => {
    console.log('Connected to database');
  })
  .catch(() => {
    console.log('Connection failed');
  });

app.use(bodyParser.json());

app.use((req,res, next) => {
  res.setHeader('Access-Control-Allow-Origin', process.env.CORS_ORIGIN);
  res.setHeader('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept');
  res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PATCH, DELETE, OPTIONS');
  next();
});


app.post('/api/user', (req, res,next) => {
  const user = new User({
    firstName: req.body.firstName,
    email: req.body.email
  });
  console.log(user);
  user.save();
  res.status(201).json({
    message: 'Post added successfully'
  });
});

module.exports = app;
版本

Package                           Version
-----------------------------------------------------------
@angular-devkit/architect         0.803.22
@angular-devkit/build-angular     0.803.22
@angular-devkit/build-optimizer   0.803.22
@angular-devkit/build-webpack     0.803.22
@angular-devkit/core              8.3.22
@angular-devkit/schematics        8.3.22
@angular/cli                      8.3.22
@angular/pwa                      0.803.22
@ngtools/webpack                  8.3.22
@schematics/angular               8.3.22
@schematics/update                0.803.22
rxjs                              6.5.4
typescript                        3.5.1
webpack                           4.39.2

Node JS version is 12.13.1

我明白了。问题是,我必须在Chrome dev remote devices tools中添加一条额外的规则,以转发网站正在使用的localhost:3000。因为我没有,在设备上运行时,它在设备上寻找localhost:3000,而不是运行localhost:3000 Node/Express的桌面。

你能用启动服务器的代码更新吗?rpereira15,这都是在开发环境中我的机器上,所以我启动服务器。当我使用浏览器而不是设备从我的机器上运行它时,代码会一直传到API和database.Correction。当我使用http服务器和端口8080时,无论是在浏览器中还是通过Chrome开发工具从设备中使用服务工作者。我查看了服务人员代码来比较设备和浏览器,没有发现任何区别。这两个请求看起来相同,并且调用同一个本地服务器(localhost:3000),但设备似乎无法访问localhost:3000。任何帮助或想法都将不胜感激。