2015-09-08 2 views
0

У меня есть приложение Node Express, и написал немного промежуточный слой, чтобы сделать следующее:Не удается установить заголовки после отправки ошибки от Экспресса промежуточного

  • Проверь все входящие запросы, если это от бота
  • Разрешить запросы на сырьевые ресурсы через
  • Если запросы от бота, сервера HTML-Сделать снимок

Я получаю следующее сообщение об ошибке из приведенной ниже коды:

Error: Can't set headers after they are sent.

Я не уверен, почему это происходит, может ли кто-нибудь помочь?

var snapshotDir = require("path").resolve(__dirname + "/../snapshots"); 

var bots = [ 
    /facebookexternalhit/, 
    /googlebot/ 
]; 

var resources = [ 
    /\/framework\//, 
    /\/partials\//, 
    /\/views\// 
]; 

app.use(function(req, res, next){ 

    //test user-agent against bots array 
    var isBot = function(agent){ 
    return bots.some(function(bot){ 
     return bot.test(new RegExp(agent)); 
    }); 
    } 

    //test path for raw resources 
    var isResource = function(path){ 
    return resources.some(function(resource){ 
     return resource.test(new RegExp(path)); 
    }); 
    } 

    //check request type 
    if (isResource(req.url)) return next(); //request is for raw resource 
    if (!isBot(req.get("user-agent")) && !/\?_escaped_fragment_=/.test(req.url)) return next(); //user-agent is not bot 

    //get url path without escaped fragment 
    var path = req.url.replace("?_escaped_fragment_=", ""); 

    //format path into filename 
    if (path.charAt(0) !== "/") path = "/" + path; //prepend fragment with '/' 
    if (path === "/") path = "/index.html"; //home requested: serve index.html 
    if (path.indexOf(".html") == -1) path += ".html"; //append fragment with '.html' 

    //serve snapshot file 
    try { res.sendFile(snapshotDir + path); } //serve html snapshot 
    catch (err) { res.send(404); } //no snapshot available, serve 404 error 

    //next request 
    return next(); 

}); 

ответ

0

Вы не можете написать дважды res.send для одного запроса (который вы делаете здесь, если первое утверждение не удается, и переходит к блоку улова)

try { res.sendFile(snapshotDir + path); } //serve html snapshot 
catch (err) { res.send(404); } //no snapshot available, serve 404 error 

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

Вероятно, файл не существует (вы можете проверить, что с помощью fs.statSync

+0

Спасибо, Ваш ответ помог мне в решении, но была одна вещь, которую вы пропустили. В 'Next()' также вызывают вопросы в конце, поэтому я переместил его в утверждение if ближе к вершине. – Coop

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