首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么js express中的app.use()可能不能工作?

为什么js express中的app.use()可能不能工作?
EN

Stack Overflow用户
提问于 2022-11-29 18:25:17
回答 2查看 28关注 0票数 -1

我试图处理CORS问题,并添加必要的字符串以响应其标题:

代码语言:javascript
运行
复制
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())显示了标准标题:

代码语言:javascript
运行
复制
[Object: null prototype] {
  'x-powered-by': 'Express',
  'content-type': 'text/plain; charset=utf-8',
  'content-length': '2',
  etag: 'W/"2-nOO9QiTIwXgNtWtBJezz8kv3SLc"'
}

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

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

代码语言:javascript
运行
复制
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());
});

`它确实起作用了:

代码语言:javascript
运行
复制
[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

我做错了什么,在哪里找错了

EN

回答 2

Stack Overflow用户

发布于 2022-11-29 19:28:23

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

代码语言:javascript
运行
复制
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包。

票数 0
EN

Stack Overflow用户

发布于 2022-11-29 19:46:32

我发现我可以把res.header(.)直接进入路由器的主体,而不使用app.use():

代码语言:javascript
运行
复制
router.options('/*', function(req, res, next){
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.sendStatus(200);
    console.log(res.getHeaders());
});

而且起作用了。也许,解决方案总是表面上的,但我花了将近一天的时间来获得这个结果:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74618656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档