【问题标题】:prerender.io with native Node.jsprerender.io 与本机 Node.js
【发布时间】:2017-08-28 15:09:32
【问题描述】:

我正在尝试为在本机 Node.js 服务器上运行的 Angular 1.6.0 应用程序实现 prerender.io

设置中间件的文档使用了connect middleware,并特别引用了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'));

我只是在上面的服务器代码之后附加的。

我没有收到任何错误,但在运行 node server 后,我在 localhost:3000 上看不到任何错误。虽然,我的应用程序在 localhost:8080 上运行良好

如何在此服务器上设置 prerender.io?

【问题讨论】:

    标签: javascript angularjs node.js express prerender


    【解决方案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_=

    【讨论】:

      猜你喜欢
      • 2015-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-22
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多