res.download не устанавливает правильные заголовки только в одном express маршруте - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть основной express маршрут, по которому после перехода следует запросить загрузку указанного файла в res.download:

app.get('/download/:fileid', (req, res) => {
    var connection = mysql.createConnection({
        host     : 'localhost',
        user     : 'root',
        password : '',
        database : 'filesystem'
      });

    connection.connect(() => {
        console.log("Connection to database established");

    });
    connection.query(`SELECT * from files where fileid = '${req.params.fileid}'`, (error, results, fields) => {
        if (error) throw error;
        else if(results.length === 0){
            console.log("empty");
        }
        else{
            res.download(`./uploads/PFSk5x7bg.png`, 'PFSk5x7bg.png', (err) => {
                console.log(err);
            })
        }
    });

    connection.end();
})

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

Я попытался создать другой маршрут только для тестирования:

app.get('/test', (req, res) => {
    res.download(`./uploads/PFSk5x7bg.png`, 'PFSk5x7bg.png', (err) => {
        console.log(err);
    })
})

, и он работает .... содержимое есть заголовок расположения, браузер фактически загружает файл.

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

*** ОБНОВЛЕНИЕ: Я изменил имя маршрут / download /: fileid к / test /: fileid и все заработало. Затем я изменил его НАЗАД на / download /: fileid, и теперь он работает ... Кто-нибудь знает, что могло вызвать это?

1 Ответ

0 голосов
/ 30 апреля 2020

У вас есть несколько ошибок, которые могут испортить вашу отладку.

  1. Вы неправильно разместили оператор connection.end(), который будет сразу вызываться после connection.query(). Вы должны переместить его в функцию обратного вызова connection.query.

  2. Использование относительных путей вместо абсолютных. Попробуйте изменить './uploads/PFSk5x7bg.png' на __dirname + '/uploads/PFSk5x7bg.png'

  3. Неиспользование res.end() в запросе, где это необходимо, может привести к путанице в представлении ответа вашего программного обеспечения в браузере.

    if (error) { 
        res.end();
        throw error;
    }else if(results.length === 0){
        res.end();
        console.log("empty");
    }
    else{
        res.download(`./uploads/PFSk5x7bg.png`, 'PFSk5x7bg.png', (err) => {
            console.log(err);
        })
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...