Expressjs如何在一条路线上启用CORS?

时间:2017-11-29 03:06:51

标签: node.js express

以下代码不起作用

import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
from mpl_toolkits.axes_grid1.inset_locator import zoomed_inset_axes
from mpl_toolkits.axes_grid1.inset_locator import mark_inset
import matplotlib.image as mpimg
import matplotlib.patches as patches
import numpy as np

def zoom_in_rec(input, ax,rect, cmap):
    axins = zoomed_inset_axes(ax, 2, loc=3)  # zoom-factor: 2.5, location: upper-left
    x1, x2, y1, y2 = rect.get_x(), rect.get_x()+rect.get_width(),rect.get_y(), rect.get_y()+rect.get_height() # specify the limits
    axins.set_xlim(x1, x2)  # apply the x-limits
    axins.set_ylim(y1, y2)  # apply the y-limits
    mark_inset(ax, axins, loc1=3, loc2=4, fc="none", ec="1.0")
    plt.yticks(visible=False)
    plt.xticks(visible=False)
    # flip image
    rot = np.flipud(input)
    axins.imshow(rot, cmap=cmap)

if __name__ == "__main__":
    img = mpimg.imread('/home/eyllanesc/Downloads/lena.png')
    #Plot
    fig = plt.figure(figsize=(128,128))
    fig.patch.set_facecolor('white')
    gs1 = gridspec.GridSpec(1,1)
    gs1.update(wspace=0.02, hspace=0.02)  # set the spacing between axes.
    ax1 = plt.subplot(gs1[0])
    ax1.imshow(img,cmap='gray')
    rect1 = patches.Rectangle((200, 200), 120, 80, linewidth=3, edgecolor='r', facecolor='none')
    zoom_in_rec(img, ax1,rect1, cmap='gray')
    plt.show()

请注意,我不想为整个应用启用CORS。

4 个答案:

答案 0 :(得分:2)

发布此作为答案,因为它原来是问题(根据我之前的评论)。根据您正在进行的确切CORS请求,浏览器可能会决定是否需要执行请求的预先安排。如果是,则还需要在匹配的OPTIONS请求中设置自定义标头。

许多事情都可以触发预飞行,例如自定义标题,使用某些动词,某些身份验证机制等......

在这些文章中有关于哪些类型的请求触发飞行前的描述:

Using CORS

Cross Origin Resource Sharing

基本上,任何未被定义为"简单请求的请求"简单请求只使用GET,HEAD和POST以及一小组自定义标头。对于某些标题,其他任何内容甚至某些值都会触发预检请求,其中浏览器会在发送实际网址之前向相同的URL请求转发前授权发送OPTIONS请求。

答案 1 :(得分:2)

您可以使用类似这样的内容:

var express = require('express')
var cors = require('cors')
var  corsOptions = { origin: 'http://yourapp.com'}
var app = express()

app.get('/products/:id', cors(corsOptions), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a Single Route'})
})

app.listen(8080, function () {
  console.log('CORS-enabled web server listening on port 8080')
})

默认情况下,只有6个响应标头通过CORS公开:

  1. 缓存控制
  2. 内容语言
  3. 内容类型
  4. 到期
  5. 最后修改
  6. 编译指示

如果要公开其他标题,则可以使用暴露的标题选项:

 corsOptions = {
  exposedHeaders: ['Content-Length', 'X-Foo', 'X-Bar'],
}

有关CORS的更多详细信息,请参考此内容:

  

More detail on cors

答案 2 :(得分:0)

基于Clark Jung的回复,您可以使用https://github.com/expressjs/cors#enable-cors-for-a-single-route

var express = require('express')
var cors = require('cors')
var app = express()

app.get('/products/:id', cors(), function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for a Single Route'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

答案 3 :(得分:-1)

为什么不使用https://github.com/expressjs/cors。你可以这样使用。

var express = require('express')
var cors = require('cors')
var app = express()

app.use(cors())

app.get('/products/:id', function (req, res, next) {
  res.json({msg: 'This is CORS-enabled for all origins!'})
})

app.listen(80, function () {
  console.log('CORS-enabled web server listening on port 80')
})

或参考此处https://enable-cors.org/server_expressjs.html

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();
});

app.get('/', function(req, res, next) {
  // Handle the get for this route
});

app.post('/', function(req, res, next) {
 // Handle the post for this route
});