Menu
CoddyTech

CORS

Coddy'nin Node.js Journey'sinin REST API'leri bölümünün bir parçası. Ders 13 / 18.

https://board.example.com adresindeki bir sayfa, API'nizi fetch ile çağırıyor ve tarayıcı yanıtı engelliyor. Sunucu CORS başlıklarıyla başkalarına izin vermediği sürece tarayıcılar, bir sayfanın yalnızca geldiği şema, ana makine ve bağlantı noktası olan kendi kökeninden gelen yanıtları okumasına izin verir.

OPTIONS /api/products/7
Origin: https://shop.example.com
Access-Control-Request-Method: DELETE

204 No Content
Access-Control-Allow-Origin: https://shop.example.com
Access-Control-Allow-Methods: GET, DELETE
Access-Control-Allow-Headers: Content-Type

Bir DELETE, PATCH veya JSON gövdesinden önce tarayıcı bu ön kontrol isteğini gönderir ve yalnızca yanıt izin verirse devam eder. Diğer tüm yanıtların da Access-Control-Allow-Origin başlığına ihtiyacı vardır. * herhangi bir kökene izin verir ancak sayfa çerez gönderdiğinde tarayıcılar bunu kabul etmez (Access-Control-Allow-Credentials: true); bu nedenle kökeni belirtin. CORS'u yalnızca tarayıcılar uygular: curl ve istek çubuğu bunu yok sayar.

challenge icon

Görev

Kolay
  • Rotalardan önceki bir ara yazılım, her yanıta Access-Control-Allow-Origin: https://board.example.com ve Access-Control-Allow-Credentials: true ekler.
  • OPTIONS, GET, POST, PUT, PATCH, DELETE yöntemlerini listeleyen Access-Control-Allow-Methods ve Access-Control-Allow-Headers: Content-Type ile birlikte 204 yanıtı verir.

Tarayıcıyı canlandır: Origin: https://board.example.com başlığıyla OPTIONS /api/tasks/2 isteği gönder, ardından GET /api/tasks isteği gönder ve her yanıtın başlıklarını oku.

Kendin dene

import express from 'express';
import { sendError } from './errors.js';
import taskRoutes from './routes/tasks.js';

const app = express();
app.use(express.json());

app.use('/api/tasks', taskRoutes);

// Rotalardan gelen hatalar burada ele alınır. Geçerli JSON olmayan bir gövde,
// istemcinin hatasıdır (400); bunun dışındaki her hata bize aittir (500).
app.use((err, req, res, next) => {
    if (err.type === 'entity.parse.failed') {
        return sendError(res, 400, 'invalid_json', 'The body is not valid JSON');
    }
    console.error(err);
    sendError(res, 500, 'server_error', 'Something went wrong');
});

app.listen(3000, () => {
    console.log('Task tracker API on port 3000');
});
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

REST API'leri bölümündeki tüm dersler