带有Angular和Node的Facebook OG Meta

时间:2014-12-07 16:12:23

标签: javascript angularjs node.js facebook facebook-opengraph

我正在尝试使用angular / node应用程序来呈现动态的Open graph元内容。

我一直在尝试遵循这个教程http://www.codewarmer.com/posts/1394433236-configuring-angularjs-nodejs-for-search-bots#

我在幻影处理节点方面遇到了一些问题,我的问题似乎与此类似Error message when using PhantomJS, breaks at random intervals

除了我的错误不是以随机间隔发生,它始终发生。

编辑:这是我的代码

在我的server.js中,我需要一个基于上述名为PhantomHandler.js创建的模块,它就像这样被调用。

var crawler = require('./modules/PhantomHandler');

这就是PhantomHandler.js的样子:

    var phantom = require('phantom');
var models = require('../models');

mongoose = require('mongoose');
Snapshot = models.Snapshot;

url = require('url');
var baseUrl = 'my url';

function crawlSite(idx, arr, page, callback) {
    crawlUrl(arr[idx], page, function(data) {
        data.links.forEach(function(link) {
            if (arr.indexOf(link) < 0)
                arr.push(link);
        });
        Snapshot.upsert(data);

        if (++idx === arr.length)
            callback();
        else
            crawlSite(idx, arr, page, callback);
    });
}

function startPhantom(cb) {
    phantom.create(function(ph) {
        phInstance = ph;
        ph.createPage(function(page) {
            phPage = page;
            cb(ph, page);
        });
    });
}

function crawlUrl(path, page, cb) {
    uri = url.resolve(baseUrl, path);

    page.open(uri, function(status) {
        var evaluateCb = function(result) {
            result.path = path;
            cb(result);
        };
        //Timeout 2000ms seems pretty enough for majority ajax apps
        setTimeout(function() {
            if (status == 'success')
                page.evaluate(function() {
                    var linkTags = document.querySelectorAll('a:not([rel="nofollow"])');
                    var links = [];
                    for (var i = 0, ln; ln = linkTags[i]; i++)
                        links.push(ln.getAttribute('href'));

                    return {
                        'links': links,
                        'html': document.documentElement.outerHTML
                    };
                }, evaluateCb);
        }, 2000);
    });
}

exports.crawlAll = function(callback) {
    startPhantom(function(ph, page) {
        crawlSite(0, ['/'], page, function() {
            ph.exit();
            callback();
        });
    });
};

exports.crawlOne = function(path, callback) {
    startPhantom(function(ph, page) {
        crawlUrl(path, page, function(data) {
            Snapshot.upsert(data);
            ph.exit();
            callback();
        });
    });
};

当我运行此代码时,我的确切错误是:

    phantom stderr: 'phantomjs' is not recognized as an internal or exte
,
operable program or batch file.


assert.js:92
  throw new assert.AssertionError({
        ^
AssertionError: abnormal phantomjs exit code: 1
    at Console.assert (console.js:102:23)
    at ChildProcess.<anonymous> (path to node modules\node_modules\phantom\phantom.js:150:28)
    at ChildProcess.emit (events.js:98:17)
    at Process.ChildProcess._handle.onexit (child_process.js:809:12)

我的问题:这是获得角色与Facebook OG玩得很好的最简单方法吗?如果可以的话,其他任何人都可以确认他们是否已经设法让这种技术与幻象一起抛出如上所述的断言错误。

看起来这应该是一个相对常见的工作,我很惊讶我没有找到一个很好的直接教程如何让它工作,除非我只是没有正确看:s

由于

1 个答案:

答案 0 :(得分:1)

好的,

因为我的问题基本上是“使用正确的页面元来获得角度和节点以回应Facebook的最佳方法”。我现在可以发布我的答案了。

  1. 如上所述,我认为使用上述phantom.js方法需要安装幻像并在node.js服务器上作为单独的进程运行。 (任何人都可以确认或否认这一点吗?)

  2. 对于我的情况,我只是希望用户能够从网站发布链接到Facebook和Facebook,以使用开放图元返回一个漂亮的链接。

  3. 考虑到这一点,我决定跳过上面教程中的解决方案中的phantom.js步骤。相反,我推出了一些代码,当用户点击页面时,这些代码基本上将HTML片段保存到数据库中。 HTML代码段只包含我需要的Facebook元标记。然后我使用上面教程的最后一部分将Facebook机器人引导到我保存的HTML片段。

    它看起来效果很好。