node.js - Express 在 AppFog 上出错,但在本地则不然

标签 node.js express jsdom appfog

当我在 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 上运行的 native 库,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');

关于node.js - Express 在 AppFog 上出错,但在本地则不然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15034317/

相关文章:

node.js - Firebase云函数多次执行

node.js - 使用 pm2 在同一 Node 上运行多个 Node 实例

mysql - 序列化 findAll 查询返回不正确的结果

node.js - jsdom - document.querySelector 已启用,但文档中缺少

node.js - 使用jsdom解析html文件体

c# - 无法找到 CodeDom 提供程序类型 'Microsoft.VisualC.CppCodeProvider',正在尝试编译 node_modules

node.js - NodeJS SetInterval 与 Async/Await

javascript - 采用expressJS的MVC结构的中间件

node.js - npm install express-generator 没有安装 express

node.js - jsdom.jsdom 缺少 "createWindow"方法