2015-10-23 2 views
2

Предположим, что каждый запрос к моему приложению содержит заголовок MAGIC, и я хочу где-то ввести это значение заголовка, не обновляя все мои методы запроса. Похоже, что это работа для промежуточного программного обеспечения, не так ли?Использование промежуточного программного обеспечения Express для конфигурации модуля для каждого запроса?

Но это будет потокобезопасным? Есть ли способ сделать это, используя промежуточное ПО Express в мире, где одновременно могут выполняться несколько запросов?

Другими словами, я спрашиваю, является ли промежуточное ПО Express в примере кода заданием глобальной общей переменной или если каждый запрос обрабатывается независимым потоком, где myconfig является изолированной копией для каждого отдельного запроса.

Пример кода:

var assert = require('assert'); 
var sleep = require('sleep'); 

var express = require('express'); 
var app = express(); 

var myconfig = {}; 

app.use(function(req, res, next) { 
    myconfig.MAGIC = req.headers['MAGIC']; 
    next(); 
}); 

app.get('/test', function(req, res) { 
    // Pause to make it easy to have overlap. 
    sleep(2); 
    // If another request comes in while this is sleeping, 
    // and changes the value of myconfig.MAGIC, will this 
    // assertion fail? 
    // Or is the copy of `myconfig` we're referencing here 
    // isolated and only updated by this single request? 
    assert.equal(myconfig.MAGIC, req.headers['MAGIC']); 
}); 

ответ

2

Любая функция промежуточного программного обеспечения будет выполняться для каждого запроса. При использовании промежуточного программного обеспечения, чтобы установить значение чего-то, обычно рекомендуется установить его в app.locals или res.locals, в зависимости от того, как вы хотите, чтобы данные сохранялись. Вот хорошее сравнение двух: https://stackoverflow.com/a/14654655/2690845

app.use(function(req, res, next) { 
    if (req.headers['MAGIC']) { 
    app.locals.MAGIC = req.headers['MAGIC']; 
    } 
    next(); 
}); 
... 
app.get('/test', function(req, res) { 
    assert.equal(app.locals.MAGIC, req.headers['MAGIC']); 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^