【问题标题】:Node/Express - Otherwise Route and CORSNode/Express - 否则路由和 CORS
【发布时间】:2016-06-09 20:05:50
【问题描述】:

我正在准备用于生产的 Node/Express API,但是有一些问题/建议需要帮助:

1 - 我正在使用 npm 包 cors - 这样做是为了开发基本上禁用 CORS,但是现在我正在转向生产,我只希望某些 URLS 能够访问 API。

所以我看到的是:

var corsOptions = {
  origin: 'http://www.example.com',
  methods: ['GET', 'POST']
};

app.get('*', cors(corsOptions), function(req, res, next) {
  res.json({msg: 'This is CORS-enabled for only example.com.'});
});

但是(据我所见)我需要为每个请求类型执行此操作,例如

app.post('*', cors(corsOptions), function(req, res, next) {
      res.json({msg: 'This is CORS-enabled for only example.com.'});
});

app.del('*', cors(corsOptions), function(req, res, next) {
      res.json({msg: 'This is CORS-enabled for only example.com.'});
});

有没有更简单的方法来避免这种重复?

2 - 第二个问题 - 我有一长串 API 路由,例如

router.post('/registerUser', function(req, res) {
  ...
}

是否可以放置某种“否则”行,以便如果路线与我定义的任何内容都不匹配,我可以返回特定的内容?

谢谢。

【问题讨论】:

  • 对于第二个问题,您可以在主文件中使用以下代码(如果没有路由匹配,这将被执行):app.use(function(req, res, next) { // your custom response here });

标签: node.js express routing cors


【解决方案1】:

首先将 cors 作为中间件放在您的第一条路线之前。

   app.use(cors(corsOptions));
    //routes down below

说明:将为每个请求为以下所有路由设置 Cors。因为这个中间件会先被执行。

第二次把你的其他路线或 404 路线放在你最后一条路线之后。

app.use((req,res,next)=>{
   //Your message
   res.send('Page Not Found');
});

说明:如果任何路由不匹配,则触发该路由。

【讨论】:

  • 谢谢 - 我实际上是在一个单独的文件中定义了我的路线,即app.use('/api', require('./routes/api')); 我试图将第一段代码放在这一行上方,第二段放在后面,但它没有用。有什么想法吗?
  • 啊 - 我认为它确实有效。有趣的是,当我在浏览器上尝试时,它的行为符合预期,但在 Postman 上,它总是有效,即使我将原始 URL 设置为随机的。这是因为那个应用设置了Access-Control-Allow-Origin吗?如果是这样,技术上没有人能做到吗?
  • 不,是浏览器检查您的域和请求的 API 域,并限制 frm 访问内容。但是如果它找到 Access-Control-Allow-Origin Header 然后它允许它的 web 应用程序访问它。
  • Postman 并不暗示这样的检查,它只是简单地点击 url 并显示响应内容
  • 事实上,如果你只用浏览器点击你的API,它就会显示内容。但是,如果您在某个来自不同域的 Web 应用程序中访问您的 API,那么它不会让您访问响应数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
  • 2018-04-23
  • 2018-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-04
相关资源
最近更新 更多