1. ホーム
  2. node.js

[解決済み】「アクセス制御-許可-オリジン」がない - Node / Apacheのポートの問題

2022-03-27 06:04:57

質問

Node/Expressを使って小さなAPIを作成し、Angularjsを使ってデータを取り込もうとしていますが、私のhtmlページはapacheの下でlocalhost:8888で実行され、node APIはポート3000でリスンしているので、「アクセス制御-許可-オリジン」なしが表示されます。そこで node-http-proxy とVhosts Apacheを使用していますが、あまり成功していません。以下のエラーとコードを参照してください。

<ブロッククオート

XMLHttpRequest は localhost:3000 を読み込むことができません。要求されたリソースに 'Access-Control-Allow-Origin' ヘッダーが存在しません。したがって、オリジン「localhost:8888」はアクセスを許可されていません"。

// Api Using Node/Express    
var express = require('express');
var app = express();
var contractors = [
    {   
     "id": "1", 
        "name": "Joe Blogg",
        "Weeks": 3,
        "Photo": "1.png"
    }
];

app.use(express.bodyParser());

app.get('/', function(req, res) {
  res.json(contractors);
});
app.listen(process.env.PORT || 3000);
console.log('Server is running on Port 3000')

アンギュラーコード

angular.module('contractorsApp', [])
.controller('ContractorsCtrl', function($scope, $http,$routeParams) {

   $http.get('localhost:3000').then(function(response) {
       var data = response.data;
       $scope.contractors = data;
   })

HTML

<body ng-app="contractorsApp">
    <div ng-controller="ContractorsCtrl"> 
        <ul>
            <li ng-repeat="person in contractors">{{person.name}}</li>
        </ul>
    </div>
</body>

解決方法は?

NodeJS/Expressアプリに以下のミドルウェアを追加してみてください(便宜上、コメントをつけています)。

// Add headers before the routes are defined
app.use(function (req, res, next) {

    // Website you wish to allow to connect
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost:8888');

    // Request methods you wish to allow
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE');

    // Request headers you wish to allow
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content-type');

    // Set to true if you need the website to include cookies in the requests sent
    // to the API (e.g. in case you use sessions)
    res.setHeader('Access-Control-Allow-Credentials', true);

    // Pass to next layer of middleware
    next();
});

お役に立てれば幸いです。