prerender.io с нативным Node.js

Я пытаюсь реализовать prerender.io для моего приложения Angular 1.6.0, работающего на собственном сервере Node.js.

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

app.use(require('prerender-node').set('prerenderToken', 'TOKEN'));

Я не использую Express и не использую промежуточное ПО Connect для запуска своего сервера.

Мой server.js выглядит следующим образом:

var app = http.createServer(function(req, res){

var filePath = './debug/index.html'; 
var uri = req.url;

// Load index.html only when uri is not referencing a sub-directory of ./www (and is thus a URL)
for(i in dir){
    if(uri.includes('/'+dir[i])) {
        filePath = './debug'+uri;
        break;
    }
} 

fs.exists(filePath, function(exists) {

    if(exists){

        fs.readFile(filePath, function(err, html) {

            if(err){ res.writeHead(500); res.end(); } 
            else {        

                var ext = path.extname(filePath);
                var contentType = 'text/html';
                switch(ext) {
                    case '.js':
                        contentType = 'text/javascript';
                        break;
                    case '.css':
                        contentType = 'text/css';
                        break;
                    case '.jpg':
                        contentType = 'image/jpeg';
                        break;
                    case '.png':
                        contentType = 'image/png';
                        break;
                    case '.svg':
                        contentType = 'image/svg+xml';
                        break;
                    case '.pdf':
                        contentType = 'application/pdf';
                        break;
                    default: contentType = 'text/html';
                }

                res.writeHead(200, { 'Content-Type': contentType });
                res.end(html, 'utf-8');
            }

        });

    } else {

        res.writeHead(404);
        res.end();
    }
});   

}).listen(port, function(){

    console.log('server is running on port '+port);

});

1) Как я могу реализовать prerender.io с этой конфигурацией?

2) На самом деле я установил Connect и попытался реализовать промежуточное программное обеспечение следующим образом:

var conn = connect();
conn.use(require('prerender-node').set('prerenderServiceUrl','http://localhost:3000/').set('prerenderToken', 'lqnF62jXABouJiFA2SuA'));

Который я только что добавил после приведенного выше кода сервера.

Я не получаю никаких ошибок, но я не вижу ничего на локальном хосте: 3000 после запуска node server. Хотя мое приложение отлично работает на локальном хосте: 8080.

Как я могу настроить prerender.io на этом сервере?


person yevg    schedule 28.08.2017    source источник


Ответы (1)


Вы могли бы сделать что-то вроде следующего, но я бы предложил разбить каждую функцию на отдельную функцию, чтобы предотвратить все обратные вызовы. Просто хотел оставить код в покое, чтобы вы могли видеть, где он был изменен.

var prerender = require('prerender-node').set('prerenderToken', 'TOKEN');
var app = http.createServer(function(req, res){

prerender(req, res, function() {

    var filePath = './debug/index.html'; 
    var uri = req.url;

    // Load index.html only when uri is not referencing a sub-directory of ./www (and is thus a URL)
    for(i in dir){
        if(uri.includes('/'+dir[i])) {
            filePath = './debug'+uri;
            break;
        }
    } 

    fs.exists(filePath, function(exists) {

        if(exists){

            fs.readFile(filePath, function(err, html) {

                if(err){ res.writeHead(500); res.end(); } 
                else {        

                    var ext = path.extname(filePath);
                    var contentType = 'text/html';
                    switch(ext) {
                        case '.js':
                            contentType = 'text/javascript';
                            break;
                        case '.css':
                            contentType = 'text/css';
                            break;
                        case '.jpg':
                            contentType = 'image/jpeg';
                            break;
                        case '.png':
                            contentType = 'image/png';
                           break;
                        case '.svg':
                            contentType = 'image/svg+xml';
                            break;
                        case '.pdf':
                            contentType = 'application/pdf';
                            break;
                        default: contentType = 'text/html';
                    }

                    res.writeHead(200, { 'Content-Type': contentType });
                    res.end(html, 'utf-8');
                }

            });

        } else {

            res.writeHead(404);
            res.end();
        }
    });   
});

}).listen(port, function(){

    console.log('server is running on port '+port);

});

Что касается вашего второго вопроса, возможно, вы установили его правильно. Видите ли вы запрос на консоли вашего сервера пререндеринга, если вы перейдете к:

http://localhost:8080/?_escaped_fragment_=

person Prerender.io    schedule 28.08.2017