Angular http返回状态0,但我期望404

时间:2017-07-26 17:05:31

标签: angular angular-http

我向具有以下路由的服务器发出请求:

app.use('/401', (req, res) => res.status(401).end());
app.use('/403', (req, res) => res.status(403).end());
app.use('/404', (req, res) => res.status(404).end());
app.use('/500', (req, res) => res.status(500).end());
app.use('/502', (req, res) => res.status(502).end());
app.use('/503', (req, res) => res.status(503).end());
app.use('/504', (req, res) => res.status(504).end());

当我使用Angular(/404{})发出请求时:

public async post(path: string, data: object): Promise<Response> {
  try {
    return await this.http.post(path, data).toPromise();
  } catch (err) {
    console.log('err', err);
    throw err;
  }
}

我明白了:

ok: false
status: 0
statusText: ""
type: 3

在Chrome控制台中,我看到请求是使用OPTIONS并且确实返回404:

Request URL: http://localhost:3000/404/
Request Method: OPTIONS
Status Code: 404 Not Found

它去了哪里?如何获得真正的错误代码?

我读到这可能是一个CORS问题......我的应用是在4200和我的服务3000.在我的服务中我有顶部(在其他任何事情之前):

app.use(function(req, res, next) {
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Credentials", "true");
  res.setHeader("Access-Control-Allow-Methods", "*");
  res.setHeader("Access-Control-Allow-Headers", "*");
  next();
});

我认为这不是CORs的问题......

但我不知道,不是吗?

我不应该err状态为404吗?

1 个答案:

答案 0 :(得分:2)

显然OPTIONS永远不会返回404,因为它会导致此错误:

  

预检的响应包含无效的HTTP状态代码404

如果请求是end请求,我将标头更改为OPTIONS,否则会继续:

const headers = (req, res, next) => {
  res.setHeader("Cache-Control", "no-cache");
  res.setHeader("Access-Control-Allow-Origin", "*");
  res.setHeader("Access-Control-Allow-Credentials", "true");
  res.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
  res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept");
};

app.use((req, res, next) => {
  console.log(req.method);
  headers(req, res, next);

  if (req.method === 'OPTIONS') {
    return res.end();
  }

  next();
});

然后请求在Angular应用程序上返回正确的数据:

ok: false
status: 404
statusText: "Not Found"
type: 2