Node.js NPM cors包不';t设置响应头并导致超时

Node.js NPM cors包不';t设置响应头并导致超时,node.js,express,heroku,cors,Node.js,Express,Heroku,Cors,我在heroku上部署了一个express/node.js api。我的客户托管在firebase上,我对数据进行跨源请求。我正在使用cors npm包在我的app.js中设置访问控制允许源响应头,如下所示: require('dotenv').config() const express = require('express'); const morgan = require('morgan') const cors = require('cors') const helmet = requi

我在heroku上部署了一个express/node.js api。我的客户托管在firebase上,我对数据进行跨源请求。我正在使用cors npm包在我的app.js中设置访问控制允许源响应头,如下所示:

require('dotenv').config()
const express = require('express');
const morgan = require('morgan')
const cors = require('cors')
const helmet = require('helmet')
const { NODE_ENV } = require('./config')
const projectsRouter = require('./projects-router')
const app = express()
const admin = require('./firebaseAdmin');
const bodyParser = express.json();
const xss = require('xss')
const http = require('http').createServer(app);
const io = require('socket.io')(http);
const knex = require('knex')
const { DATABASE_URL, PORT } = require('./config')

http.listen(PORT, () => {
  console.log(`server listening on port: ${PORT}`)
})

app.use(cors())
app.use(helmet())
app.use(projectsRouter);

app.use((error, req, res, next) => {
  let response;
  if (process.env.NODE_ENV === 'production') {
    response = {error: {message: 'server error'}};
  }
  else {
    response = {error: {message: 'server error'}};
  }
  res.status(500).json(response);
});



module.exports = app;
当cors包放在projectsRouter之前时,对该路由器的请求会挂起一段时间,并最终失败,出现以下错误:

No 'Access-Control-Allow-Origin' header is present on the requested resource.
我删除了cors中间件,看看会发生什么,请求会立即失败,并出现相同的错误。对这里发生的事情感到非常困惑

我还为飞行前选项请求启用了cors,因为我的客户端请求发送复杂的头:

app.options('*', cors({credentials: true, preflightContinue: true}))
当我检查preflight options请求时,我看到res头包含Access Control Allow Origin:“*”,但是触发它的请求没有设置相同的头,这就是我认为preflight continue会做的


在这个问题上难倒了。非常感谢您的帮助。

您的代码请求失败的原因是什么,HTTP状态代码是什么?您可以使用浏览器devtools中的网络窗格进行检查。如果Chrome没有显示,请使用Firefox devtools中的网络窗格进行检查。是4xx还是5xx错误,而不是200 OK成功响应?