在AppFog上托管我的应用程序时出现错误。第50行,当我调用JSDOM时...问题不在本地出现,我不明白为什么它在远程环境中不起作用...

我的代码(在本地工作):

exports.index = function(req, res) {
    Creation.findAll({where: "state = 1",order: 'id DESC', limit: 2}).success( function(creations) {
        Post.findAll({where: "state = 1",order: 'id DESC', limit: 2}).success(function(posts){
            async.map(posts, function(postEntity, callback){
                jsdom.env( // PROBLEM HERE
                    postEntity.content,
                    ["http://code.jquery.com/jquery.js"],
                    function(errors, window) {
                        if(errors) return callback(errors);
                        postEntity.content = window.$("p").text();
                        callback(null, postEntity);
                    }
                );
            }, function(err, transformedPosts){
                if(err) return callback(err);
                res.render('index', {
                    creations: creations,
                    posts: transformedPosts,
                    title: "Anthony Cluse | Portfolio"
                });
            });
        });
    });
};


我的错误(在AppFog上-我向支持小组发送了一个请求):

TypeError: Cannot read property 'implementation' of undefined
at exports.env.exports.jsdom.env.processHTML (/mnt/var/vcap.local/dea/apps/anthonycluse-1-  0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/jsdom/lib/jsdom.js:178:59)
at Object.exports.env.exports.jsdom.env (/mnt/var/vcap.local/dea/apps/anthonycluse-1-   0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/jsdom/lib/jsdom.js:269:5)
at exports.index.Creation.findAll.success.Post.findAll.success.async.map.res.render.creations (/mnt/var/vcap.local/dea/apps/anthonycluse-1- 0c3b7373ee2a0a1334d2ea77a9bf22c8/app/routes/index.js:50:23)
at _asyncMap (/mnt/var/vcap.local/dea/apps/anthonycluse-1-0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/async/lib/async.js:222:13)
at async.each (/mnt/var/vcap.local/dea/apps/anthonycluse-1-0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/async/lib/async.js:99:13)
at Array.forEach (native)
at _each (/mnt/var/vcap.local/dea/apps/anthonycluse-1-0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/async/lib/async.js:32:24)
at async.each (/mnt/var/vcap.local/dea/apps/anthonycluse-1-0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/async/lib/async.js:98:9)
at _asyncMap (/mnt/var/vcap.local/dea/apps/anthonycluse-1-0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/async/lib/async.js:221:9)
at Object.doParallel [as map] (/mnt/var/vcap.local/dea/apps/anthonycluse-1- 0c3b7373ee2a0a1334d2ea77a9bf22c8/app/node_modules/async/lib/async.js:199:23)


登录AppFog:

====> /logs/staging.log <====

# Logfile created on 2013-02-22 23:41:12 +0000 by logger.rb/25413
Skipping npm support: npm-shrinkwrap.json is not provided

====> /logs/stdout.log <====

Express server listening on port 56643
Executing: CREATE TABLE IF NOT EXISTS `Posts` (`slug` VARCHAR(255), `title` VARCHAR(255), `thumbnail` VARCHAR(255), `content` TEXT, `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing: CREATE TABLE IF NOT EXISTS `Creations` (`slug` VARCHAR(255), `screenshot` VARCHAR(255), `title` VARCHAR(255), `subtitle` VARCHAR(255), `url` VARCHAR(255), `content` TEXT, `webdesigner` VARCHAR(255), `developper` VARCHAR(255), `integrator` VARCHAR(255), `designer` VARCHAR(255), `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing: CREATE TABLE IF NOT EXISTS `Posts` (`slug` VARCHAR(255), `title` VARCHAR(255), `thumbnail` VARCHAR(255), `content` TEXT, `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing: CREATE TABLE IF NOT EXISTS `Creations` (`slug` VARCHAR(255), `screenshot` VARCHAR(255), `title` VARCHAR(255), `subtitle` VARCHAR(255), `url` VARCHAR(255), `content` TEXT, `webdesigner` VARCHAR(255), `developper` VARCHAR(255), `integrator` VARCHAR(255), `designer` VARCHAR(255), `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing: SELECT * FROM `Creations` WHERE state = 1 ORDER BY id DESC LIMIT 2;
Executing: SELECT * FROM `Posts` WHERE state = 1 ORDER BY id DESC LIMIT 2;
{ __options:
   { timestamps: true,
     instanceMethods: {},
     classMethods: {},
     validate: {},
     freezeTableName: false,
     underscored: false,
     syncOnAssociation: true,
     paranoid: false,
     omitNull: false,
     hasPrimaryKeys: false },
  hasPrimaryKeys: false,
  selectedValues:
   { slug: 'my-first-post',
     title: 'my first post',
     thumbnail: 'http://i.pcworld.fr/1151321-espace-sfr.jpg',
     content: '<p>\r\nun content pour le premier post\r\n</p>\r\n<img src="http://i.pcworld.fr/1151321-espace-sfr.jpg">\r\n<p>et la suite !!!</p>',
     state: 1,
     id: 1,
     createdAt: Thu Feb 21 2013 21:45:58 GMT+0000 (UTC),
     updatedAt: Thu Feb 21 2013 21:46:00 GMT+0000 (UTC) },
  slug: 'my-first-post',
  title: 'my first post',
  thumbnail: 'http://i.pcworld.fr/1151321-espace-sfr.jpg',
  content: '<p>\r\nun content pour le premier post\r\n</p>\r\n<img src="http://i.pcworld.fr/1151321-espace-sfr.jpg">\r\n<p>et la suite !!!</p>',
  state: 1,
  id: 1,
  createdAt: Thu Feb 21 2013 21:45:58 GMT+0000 (UTC),
  updatedAt: Thu Feb 21 2013 21:46:00 GMT+0000 (UTC),
  isNewRecord: false }

====> /logs/staging.log <====

# Logfile created on 2013-02-22 23:41:12 +0000 by logger.rb/25413
Skipping npm support: npm-shrinkwrap.json is not provided

====> /logs/stdout.log <====

Express server listening on port 48140
Executing: CREATE TABLE IF NOT EXISTS `Posts` (`slug` VARCHAR(255), `title` VARCHAR(255), `thumbnail` VARCHAR(255), `content` TEXT, `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing: CREATE TABLE IF NOT EXISTS `Creations` (`slug` VARCHAR(255), `screenshot` VARCHAR(255), `title` VARCHAR(255), `subtitle` VARCHAR(255), `url` VARCHAR(255), `content` TEXT, `webdesigner` VARCHAR(255), `developper` VARCHAR(255), `integrator` VARCHAR(255), `designer` VARCHAR(255), `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing: CREATE TABLE IF NOT EXISTS `Posts` (`slug` VARCHAR(255), `title` VARCHAR(255), `thumbnail` VARCHAR(255), `content` TEXT, `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;
Executing: CREATE TABLE IF NOT EXISTS `Creations` (`slug` VARCHAR(255), `screenshot` VARCHAR(255), `title` VARCHAR(255), `subtitle` VARCHAR(255), `url` VARCHAR(255), `content` TEXT, `webdesigner` VARCHAR(255), `developper` VARCHAR(255), `integrator` VARCHAR(255), `designer` VARCHAR(255), `state` INTEGER, `id` INTEGER NOT NULL auto_increment , `createdAt` DATETIME NOT NULL, `updatedAt` DATETIME NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB;


用Cheerio编辑:

var cheerio = require('cheerio'), $;

exports.index = function(req, res) {
    Creation.findAll({where: "state = 1",order: 'id DESC', limit: 2}).success( function(creations) {
        Post.findAll({where: "state = 1",order: 'id DESC', limit: 2}).success(function(posts){
            async.map(posts, function(postEntity, callback){
                $ = cheerio.load(postEntity.content);
                postEntity.content = $("p").text();
                /*
                jsdom.env(
                    postEntity.content,
                    ["http://code.jquery.com/jquery.js"],
                    function(errors, window) {
                        //deal with errors
                        if(errors) return callback(errors);
                        postEntity.content = window.$("p").text();
                        callback(null, postEntity);
                    }
                );
                */
            }, function(err, transformedPosts){
                if(err) return callback(err);
                res.render('index', {
                    creations: creations,
                    posts: transformedPosts,
                    title: "Anthony Cluse | Portfolio"
                });
            });
        });
    });
};

最佳答案

似乎jsdom依赖于无法在CloudFoundry上运行的本机库,这与AppFog所使用的相同。

看到这个jsdom问题https://github.com/tmpvar/jsdom/issues/436

解决方法是使用诸如cheerio(https://github.com/MatthewMueller/cheerio)之类的东西

这是主页上的示例:

var cheerio = require('cheerio');
var $ = cheerio.load('<h2 class = "title">Hello world</h2>');

$('h2.title').text('Hello there!');
$('h2').addClass('welcome');

09-27 03:55