Экспресс гонки во время GET - PullRequest
0 голосов
/ 01 декабря 2018

Я работаю над приложением Angular / Node / Express / Psql.Для части приложения у меня есть запросы GET, идущие в Express для получения профилей пользователей.У меня есть папка с именем profile-pics, которая содержит изображения пользователей, если изображение пользователя еще не существует, оно извлечет его из базы данных и вставит в папку, а затем вернет изображение.

Текущий способ установки запроса GET url - это вызов, подобный следующему:

user/profile-pic?username=bar123456

Он попадает на экспресс-маршрут, и некоторые вызовы возвращают одно и то же изображение профиля, даже если запрашиваются два разных.

Так, например, будут выполняться два запроса GET

user/profile-pic?username=foo123456
user/profile-pic?username=bar123456

Однако оба изображения будут иметь изображение bar123456.

Я попытался отладить его, написав

console.log('Sending back picture ' + profilePicPath). 

Когда я это сделаю, я получу

'Sending back picture bar123456'
'Sending back picture bar123456'

Это маршрут в экспрессе, который возвращает изображение.Я выполнил вызов базы данных, так как оба изображения профиля уже

userRouter.get('/user/profile-pic', function (req, res) {
    let userName = req.query.username;
    fileName = './profile-pics/' + userName + '.jpg';
    userProfilePic = userName + '.jpg';

    fs.exists(fileName, function (exists) {
        if (exists) {            
            console.log('Sending back picture ' + userProfilePic);
            res.status(200).contentType('image/png').sendFile(userProfilePic, {
                root: path.join(__dirname, '../profile-pics/')
            }, function (err) {
                if (err) {
                    console.log(err);
                }
            });
        }
    })
});

Я также попытался разрезать строку, чтобы создать новую копию, потому что я думал, что это могло быть только копирование ссылки, и ссылка изменилась.Однако это тоже не сработало.

1 Ответ

0 голосов
/ 01 декабря 2018

Вам необходимо правильно объявить переменные fileName и userProfilePic как локальные переменные.Когда вы не объявляете их как локальные, они становятся неявными глобальными переменными, и они «разделяются» между различными запросами, что может легко привести к условиям гонки, поскольку один обработчик запросов перезаписывает значения, которые другой обработчик запросов находится в середине использования.Измените это на:

userRouter.get('/user/profile-pic', function (req, res) {
    let userName = req.query.username;
    let fileName = './profile-pics/' + userName + '.jpg';
    let userProfilePic = userName + '.jpg';

    fs.exists(fileName, function (exists) {
        if (exists) {            
            console.log('Sending back picture ' + userProfilePic);
            res.status(200).contentType('image/png').sendFile(userProfilePic, {
                root: path.join(__dirname, '../profile-pics/')
            }, function (err) {
                if (err) {
                    console.log(err);
                }
            });
        }
    })
});

PS Вам также необходимо отправить ответ во всех путях кода, например, если файл не существует или в вашем обработчике ошибок.Все пути через обработчик маршрута должны либо вызывать next(), либо отправлять ответ сами.

К вашему сведению, выполнение вашего кода через линтер и / или запуск кода в строгом режиме сделает эти ошибки программирования более очевидными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...