2017-01-21 120 views
1

我的Node.js服務器代碼正在AWS實例上運行。它看起來像這樣:Node.js服務器給出的跨域請求被阻止

var express = require('express'); 
 
var http = require('http'); 
 
var bodyParser = require('body-parser'); 
 
var logger = require('morgan'); 
 
var cors = require('cors'); 
 
var SuperLogin = require('superlogin'); 
 
    
 
var app = express(); 
 
app.set('port', process.env.PORT || 3000); 
 
app.use(logger('dev')); 
 
app.use(bodyParser.json()); 
 
app.use(bodyParser.urlencoded({ extended: false })); 
 
app.use(cors()); 
 
    
 
app.use(function(req, res, next) { 
 
    res.header("Access-Control-Allow-Origin", "*"); 
 
    res.header('Access-Control-Allow-Methods', 'DELETE, PUT'); 
 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
 
    next(); 
 
}); 
 
    
 
var config = { 
 
    dbServer: { 
 
    protocol: 'http://', 
 
    host: 'localhost:5984', 
 
    user: '', 
 
    password: '', 
 
    userDB: 'sl-users', 
 
    couchAuthDB: '_users' 
 
    }, 
 
    mailer: { 
 
    fromEmail: '[email protected]', 
 
    options: { 
 
     service: 'Gmail', 
 
     auth: { 
 
      user: '[email protected]', 
 
      pass: 'userpass' 
 
     } 
 
    } 
 
    }, 
 
    security: { 
 
    maxFailedLogins: 3, 
 
    lockoutTime: 600, 
 
    tokenLife: 86400, 
 
    loginOnRegistration: true, 
 
    }, 
 
    userDBs: { 
 
    defaultDBs: { 
 
     private: ['supertest'] 
 
    } 
 
    }, 
 
    providers: { 
 
    local: true 
 
    } 
 
} 
 
    
 
// Initialize SuperLogin 
 
var superlogin = new SuperLogin(config); 
 
    
 
// Mount SuperLogin's routes to our app 
 
app.use('/auth', superlogin.router); 
 
    
 
app.listen(app.get('port')); 
 
console.log("App listening on " + app.get('port'));

我使用的離子2應用程序,使PUT調用Node.js的服務器上的端口3000上運行。當在瀏覽器上我的筆記本電腦運行App (使用ionic serve)認沽期權給予了CORS錯誤:

Cross-Origin Request Blocked: The Same Origin Policy disallows reading 
the remote resource at http://ec2-xx-xxx-xx-4xx.eu-central-1.compute.amazonaws.com/auth/login. 
(Reason: CORS header ‘Access-Control-Allow-Origin’ missing). 

至於我可以告訴服務器代碼設置爲允許所有的起源,但我仍然得到這個錯誤。

+0

你嘗試添加'OPTIONS'訪問控制允許的方法?查看https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Preflighted_requests –

+0

使用PUT將觸發瀏覽器使用OPTIONS請求預檢PUT請求。因此,除了PUT請求之外,還必須在服務器中支持OPTIONS請求,並在獲得OPTIONS請求時返回適當的信息。注意:請求中的某些其他條件也可以使用OPTIONS觸發預檢,因此如果要CORS工作,始終支持它通常是個好主意。 – jfriend00

+0

我不知道如何添加選項的處理。我正在使用的代碼是現有的節點包。 –

回答

3

這是因爲預檢被觸發了,這意味着OPTIONS請求會到達您的服務器。這個問題在 this description by MDN中得到了很好的解釋,正如@johannes merz在你的問題的評論中指出的那樣。

你可以通知服務器的代表像這樣接受它:

app.use(function(req, res, next) { 
    res.header("Access-Control-Allow-Origin", "*"); 
    res.header('Access-Control-Allow-Methods', 'DELETE, PUT'); 
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); 
    if ('OPTIONS' == req.method) { 
     res.sendStatus(200); 
    } 
    else { 
     next(); 
    }}); 
+0

這是晶圓廠!謝謝。 –