尽管使用了 CORS,但对 expressjs 的 POST 请求不起作用

Posted

技术标签:

【中文标题】尽管使用了 CORS,但对 expressjs 的 POST 请求不起作用【英文标题】:POST Request to expressjs not working despite using CORS 【发布时间】:2018-05-26 16:49:58 【问题描述】:

我的组件中有这个函数,它应该向快速 API 发送 POST 请求:

onSubmit (evt) 

      evt.preventDefault();
      //alert(JSON.stringify(this.description));
      axios.post('http://localhost:3000/api/v1/addComment', 
        articleid: this.id,
        description: this.description
      );

    

这是发送请求的 API:

router.post('/api/v1/addComment/', function(req, res) 
  var newComment = req.body;
  //newComment.id = parseInt(commentsData.length);
  commentsData.comments.push(newComment);
    
  
  fs.writeFile('app/data/comments.json', JSON.stringify(commentsData), 'utf8', function(err)
       console.log(err);
  );
  
  res.setHeader("Access-Control-Allow-Origin", "*");  
  res.json(newComment);
);

我还需要在我的 express app.js 文件中使用必要的 CORS 依赖项

var express = require('express');
var reload = require('reload');
var app = express();
var cors = require('cors');
var dataFile = require('./data/articles.json');

app.set('port', process.env.PORT || 3000 );
//app.set('appData', dataFile);
app.set('view engine', 'ejs');
app.set('views', 'app/views');

app.use(express.static('app/public'));
app.use(require('./routes/index'));
app.use(require('./routes/comments'));
app.use(cors());

var server = app.listen(app.get('port'), function()
  console.log('Listening on port ' + app.get('port'));
);

reload(server, app);

当我收到请求时,API 路由工作正常,但是,当我发出 post 请求时,我不断收到此错误:

无法加载http://localhost:3000/api/v1/addComment:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许使用原点“http://localhost:8080” 使用权。 createError.js?16d0:16 Uncaught (in promise) Error: Network Error at createError (createError.js?16d0:16) at XMLHttpRequest.handleError (xhr.js?ec6c:87)

我也尝试在 axios 发布请求中发送一个 headers 对象,但无济于事。 根据我对 CORS 的研究,我了解使用 CORS 是允许来自不同域的对您的 API 的请求所必需的。 我的 express 服务器在 localhost 3000 上运行,而我的 vue 服务器在本地主机 8080 上运行。

有人可以解释为什么尽管在 express 中需要和使用 CORS,但我仍然收到此错误吗?

【问题讨论】:

【参考方案1】:

尝试移动 app.use(cors()) 在分配路线之前先起来

【讨论】:

【参考方案2】:

飞行前部分是指 xhr 在实际的POST 之前向/api/v1/addComment 发出OPTIONS 请求。你需要配置 cors 来处理这个问题:

// preflight for aspecific route
router.options('/api/v1/addComment/', cors())

// or preflight for all routes
router.options('*', cors())

注意:您需要在定义其余路由之前进行这些调用。请参阅 npmjs 上的 docs。

【讨论】:

以上是关于尽管使用了 CORS,但对 expressjs 的 POST 请求不起作用的主要内容,如果未能解决你的问题,请参考以下文章

CORS 阻止 Expressjs 中的文件上传

ExpressJs 应用程序中的 cors-js 阻止了应该通过的请求

在使用 Swagger 开发的 NodeJS 上的 ExpressJS 框架中启用跨域资源共享 (CORS)

尝试获取资源 Passport ReactJS 和 ExpressJS 时出现 NetworkError:CORS

ExpressJS 不同的域名 - CORS

CORS 登录到 expressjs/passportjs 应用程序 401 未经授权