Другой "не может установить заголовки после их отправки" - PullRequest
0 голосов
/ 27 сентября 2018

Я получаю сообщение об ошибке «Не удается установить заголовки после их отправки», которое, как я понимаю, может быть связано с отправкой ответа с моего сервера более одного раза, однако в моем коде это не такПо крайней мере, на поверхности.Я делаю запрос к dbpedia, чтобы получить некоторые ресурсы, которые затем отправляю обратно своему клиенту.Вот код:

app.get("/",function(req,res,next){
    if (req.query.titolo){
        var response ;
        let [ artist, title ] = getArtistTitle(req.query.titolo);
        title = title.replace(" ","_");//for dbpedia resource names
        const prefixes = {
            dbo: "http://dbpedia.org/ontology/",
            db: "http://dbpedia.org/resource/"
        }
        DbPediaClient.setOptions('application/sparql-results+json',prefixes);
        DbPediaClient.query("SELECT ?abstract WHERE { db:"+title+
        " dbo:abstract ?abstract. FILTER langMatches(lang(?abstract),'en') }")
        .then((data)=>{
            response = data["results"]["bindings"][0]["abstract"]["value"] ;
            return res.json({abstract: response}) ;
        })
        .catch((error)=>{
            console.log(error);
        });
    }
});

Я использую virtuoso-sparql-client, чтобы сделать запрос к http://dbpedia.org/sparql (DbPediaClient инициализируется вне этой функции).Я уже пытался использовать res.send вместо res.json, и он по-прежнему выдает ту же ошибку.Что, кстати, так:

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/node_modules/express/lib/response.js:767:10)
    at ServerResponse.send (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/node_modules/express/lib/response.js:170:12)
    at DbPediaClient.query.then (/home/lorenzo/Scrivania/ProgettoTechweb/AlphaTube/server.js:43:15)
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)

Если вам нужна дополнительная информация, пожалуйста, спросите.

1 Ответ

0 голосов
/ 27 сентября 2018

Express - это структура, которая обрабатывает циклы запроса / ответа, перебирая маршруты, соответствующие пути, указанному в HTTP-запросе, и позволяя вашему коду отправлять ответ в каждом совпадении или вызывать next(), если он не отправлял один.Проблема в том, что у вас есть следующее:

app.get("/",function(req,res,next){
    res.sendFile(...);
    next();
});

app.get("/",function(req,res,next){
    if (req.query.titolo){
        ...
        res.json(...);
    }
});

Этот код означает

Всякий раз, когда я получаю HTTP-запрос на /, отправьте некоторый HTML, а затем, если запрос содержитtitolo в запросе также отправьте JSON.

Express сообщает, что вы не можете отправлять что-либо еще, поскольку вы уже отправили HTML.

Одно из решений можетчтобы переместить маршрут API над HTML:

app.get("/",function(req,res,next){
    if (req.query.titolo){
        ...
        res.json(...);
    } else {
      next();
    }
});

app.get("/",function(req,res){
    res.sendFile(...);
});

, что означает

Всякий раз, когда я получаю HTTP-запрос на /, если запрос содержит titolo взапрос, отправьте JSON, в противном случае отправьте HTML.

Но я рекомендую переместить маршрут API в другой путь, который не конфликтует с маршрутом для вашего статического файла, который являетсянамного более типично для HTTP-серверов.

...