【问题标题】:why app.use() in js express might not work?为什么 js express 中的 app.use() 可能不起作用?
【发布时间】:2022-11-30 03:33:52
【问题描述】:

我正在尝试处理 CORS 问题并添加必要的字符串以响应标头: `

var express = require('express');
const app = express();
var router = express.Router();

router.options('/*', function(req, res, next){
  app.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    next();
  });
  res.sendStatus(200);
  console.log(res.getHeaders());
});

` 但它不起作用 - console.log(res.getHeaders()) 显示标准标题:

[Object: null prototype] {
  'x-powered-by': 'Express',
  'content-type': 'text/plain; charset=utf-8',
  'content-length': '2',
  etag: 'W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"'
}

什么可能会阻止触发此功能?

绝望中,我尝试了这个结构: `

router.options('/*', function(req, res, next){
  const respond = async function() {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  }
  respond()
  res.sendStatus(200);
  console.log(res.getHeaders());
});

` 它确实有效:

[Object: null prototype] {
  'x-powered-by': 'Express',
  'access-control-allow-origin': '*',
  'access-control-allow-headers': 'Origin, X-Requested-With, Content-Type, Accept',
  'content-type': 'text/plain; charset=utf-8',
  'content-length': '2',
  etag: 'W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"'
}
OPTIONS /email 200 4.345 ms - 2

我做错了什么以及在哪里寻找错误

【问题讨论】:

  • 我不是 express 方面的专家,但我认为您不应该在另一个处理程序中调用 app.use,它应该在设置时调用,而不是根据请求调用。
  • 我试着把它放在路由器外面(之前)——结果是一样的。
  • @JoachimIsaksson,我使用 express-generator 创建应用程序,作为初学者,仍然对将此功能或类似功能放在哪里感到困惑:到根目录中的 /bin/www 或 app.js。实际上,我试着把这个函数放在任何地方,结果都是一样的:)

标签: node.js express cors


【解决方案1】:

带有CORS处理中间件的app.use语句必须来其他中间件。而且这些语句必须都在顶层,而不是相互嵌套:

const app = express();
app.use(function(req, res, next) {
  res.header("Access-Control-Allow-Origin", "*");
  res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
  next();
});
var router = express.Router();
router.options('/*', function(req, res, next){
  res.sendStatus(200);
  console.log(res.getHeaders());
});

您的嵌套 app.use 语句仅在传入请求由 router 处理时执行。但到那时为时已晚,因为这将有效地注册 CORS 处理中间件最后的.

您绝望的解决方案之所以有效,是因为它不涉及注册新的中间件。

作为本地 CORS 处理程序的替代方案,您可能需要考虑 cors 包。

【讨论】:

    猜你喜欢
    • 2020-02-12
    • 2012-07-04
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2021-08-07
    • 2021-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多