Restify的CORS问题

3
我创建了一个使用Restify的Node Api和ReactJs应用程序,但无论我做什么,我总是遇到POST方法的错误:
  • 405 (方法不允许)
  • 从源'http://localhost:3000'访问'http://localhost:3001/api/login'已被CORS策略阻止:对预检请求的响应未能通过访问控制检查:所请求的资源上不存在'Access-Control-Allow-Origin'标头。如果不透明的响应符合您的需求,请将请求模式设置为“no-cors”以禁用CORS获取资源。
我尝试了互联网上看到的所有方法,但我仍然遇到此问题。
以下是我的代码来调用API:
const request = new Request(url + 'login', {
    method: 'POST',
    body: JSON.stringify({ 'username' : username, 'password' : password }),
    headers: new Headers({ 'Content-Type': 'application/json' })
})
return fetch(request)
    .then(response => {
        if (response.status < 200 || response.status >= 300) {
            throw new Error(response.statusText);
        }
        return response.json();
    })
    .then(({ token }) => {
        localStorage.setItem('token', token);
    });

我会这样配置Restify:

const config = require('./config'),
  restify = require('restify'),
  errs = require('restify-errors');


var connection = config.db.get


const server = restify.createServer({
  name: config.name,
  version: config.version,
  url: config.hostname
});

server.use(restify.plugins.acceptParser(server.acceptable));
server.use(restify.plugins.queryParser());
server.use(restify.plugins.bodyParser());

server.use(
  function crossOrigin(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept");
    res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, OPTIONS, DELETE');
    res.header('Access-Control-Allow-Credentials', false);
    return next();
  }
);

server.listen(3001, function () {
  console.log('%s listening at %s', server.name, server.url);
});

server.post("/api/login", function (req, res) {
  res.send(200);
});

我希望在调用API后能够收到验证(代码200),但我总是遇到CORS问题。
还有其他需要配置的吗?
谢谢您的帮助!!! :D
1个回答

3
您需要使用corsMiddleware来避免cors问题...将此代码写入您的app.js文件中...它应该可以正常工作。
var restify = require('restify');
var corsMiddleware = require('restify-cors-middleware');

var cors = corsMiddleware({
        preflightMaxAge: 5,
        origins: ['*'],
        allowHeaders:['X-App-Version'],
        exposeHeaders:[]
      });
/**
 * Initialize Server
 */
 var server = restify.createServer();

server.pre(cors.preflight);
server.use(cors.actual);

当使用任何方法外部调用restify服务时,这个工作得很好。 - Nisar Saiyed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接