Express.js varlıklarında yanıt başlığını nasıl ayarlayabilirim


164

Express tarafından sunulan komut dosyalarında etkinleştirilmek üzere CORS ayarlamam gerekiyor. Kamu / varlıklar için bu iade yanıtlarındaki başlıkları nasıl ayarlayabilirim?

Yanıtlar:


358

Express: cors'ta CORS işlemek için npm'de en az bir ara katman yazılımı vardır . [@mscdex yanıtına bakın]

ExpressJS DOC'den özel yanıt üstbilgileri nasıl ayarlanır?

res.set(field, [value])

Başlık alanını değere ayarla

res.set('Content-Type', 'text/plain');

veya aynı anda birden çok alan ayarlamak için bir nesneyi iletin.

res.set({
  'Content-Type': 'text/plain',
  'Content-Length': '123',
  'ETag': '12345'
})

Olarak takma adı

res.header(field, [value])

Bu değerleri nasıl alabilirim? Çünkü bu değerleri resnesneye ayarladım . Bu içeriği görmeye çalıştığımda tanımsız olarak kullanıyorum res.headers;
Bruno Casali

Sonra mı kullanıyorum res.write('content')?
George

1
Bu satır, kafa yazılmadan önce kullanılmalıdır.
Virendra Singh Rathore

Nedense res.setbenim için işe yaramadı, ama corsara katman hile doğru yaptı.
Cezar D.

@BrunoCasali ekstra başlıkları varsayılan olarak tarayıcı tarafından engellenir, bkz. Stackoverflow.com/a/37931084/1507207
sbk201

48

Bu çok can sıkıcı.

Birisi hala sorun yaşıyorsa veya başka bir kütüphane eklemek istemiyorsa tamam. Tek yapmanız gereken bu orta eşya kod satırını rotalarınızdan önce yerleştirmektir.

Cors Örneği

app.use((req, res, next) => {
    res.append('Access-Control-Allow-Origin', ['*']);
    res.append('Access-Control-Allow-Methods', 'GET,PUT,POST,DELETE');
    res.append('Access-Control-Allow-Headers', 'Content-Type');
    next();
});

// Express routes
app.get('/api/examples', (req, res)=> {...});

1
Bu nokta, sıraya göre önemlidir. Değiştirirken farklı davranışlar gördüğüm için gerçekten önemli olup olmadığını merak ediyordum. Güzel. Teşekkürler
Alejandro Teixeira Muñoz

1
Güzel: sorunu mükemmel bir şekilde çözdü. Bu 6 kod satırını gerçekleştirmek için tam bir bağımlılık eklemek, herkes için tavsiye edebileceğim bir yol değil ...
Alex Clark

11

Bunu cors kullanarak yapabilirsiniz. cors CORS yanıtınızı ele alacak

var cors = require('cors')

app.use(cors());

10

Kısa cevap:

  • res.setHeaders - yerel Node.js yöntemini çağırır

  • res.set - başlıkları ayarlar

  • res.headers - res.set için bir takma ad



7

Ayrıca CORS üstbilgilerini eklemek için bir ara katman yazılımı da ekleyebilirsiniz.

/**
 * Adds CORS headers to the response
 *
 * {@link https://en.wikipedia.org/wiki/Cross-origin_resource_sharing}
 * {@link http://expressjs.com/en/4x/api.html#res.set}
 * @param {object} request the Request object
 * @param {object} response the Response object
 * @param {function} next function to continue execution
 * @returns {void}
 * @example
 * <code>
 * const express = require('express');
 * const corsHeaders = require('./middleware/cors-headers');
 *
 * const app = express();
 * app.use(corsHeaders);
 * </code>
 */
module.exports = (request, response, next) => {
    // http://expressjs.com/en/4x/api.html#res.set
    response.set({
        'Access-Control-Allow-Origin': '*',
        'Access-Control-Allow-Methods': 'DELETE,GET,PATCH,POST,PUT',
        'Access-Control-Allow-Headers': 'Content-Type,Authorization'
    });

    // intercept OPTIONS method
    if(request.method === 'OPTIONS') {
        response.send(200);
    } else {
        next();
    }
};

4

service.use(function(req, res, next) {
    res.header("Access-Control-Allow-Origin", "*");
    res.header("Access-Control-Allow-Methods", "GET,HEAD,OPTIONS,POST,PUT");
    res.header("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept, Authorization");
    next();
  });


3

@ klode'un cevabı doğru.

Ancak, başlığınızı başkaları tarafından erişilebilir hale getirmek için başka bir yanıt başlığı ayarlamanız gerekir.


Misal:

İlk olarak, yanıt başlığına 'sayfa boyutu' eklersiniz

response.set('page-size', 20);

Ardından, tek yapmanız gereken başlığınızı göstermek

response.set('Access-Control-Expose-Headers', 'page-size')

Bir saatten fazla bir süredir takıldım, özel başlıkların hiçbirinin neden diğer uca ulaşmadığını anlamaya çalıştım. Cevap onları ortaya çıkarmaktı. Çok teşekkür ederim! Bu başlığın Express belgelerinde (veya şimdiye kadar özel başlıklar hakkında okuduğum herhangi bir makalede) neden sıfır olduğu çok şaşırtıcı.
Devin Spikowski

2 başlığınız varsa ne olacak? Şöyle: javascript res.set("...","..."); res.set("...","...."); Şimdi bu 2 başlığı nasıl açığa çıkarıyorsunuz?
İmleç

Belgeleri nasıl okuduğumu keşfettim:javascript Access-Control-Expose-Headers: * // or Access-Control-Expose-Headers: <header-name>, <header-name>, ...
İmleç
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.