Nodejs项目里面使用了node-jquery,部署到appfog就出错

Nodejs项目里面使用了node-jquery,部署到appfog就出错

请问下下,这是怎么个情况?本地毫无问题啊。

 /mnt/var/vcap.local/dea/apps/opac-0-99a3338e073a0a5d12eec9c60e1a1f6b/app/node_modules/jquery/lib/node-jquery.js:10
window.XMLHttpRequest.prototype.withCredentials = false;
                     ^
TypeError: Cannot read property 'prototype' of undefined
at create (/mnt/var/vcap.local/dea/apps/opac-0-99a3338e073a0a5d12eec9c60e1a1f6b/app/node_modules/jquery/lib/node-jquery.js:10:26)
at /mnt/var/vcap.local/dea/apps/opac-0-99a3338e073a0a5d12eec9c60e1a1f6b/app/node_modules/jquery/lib/node-jquery.js:9503:18
at Object.<anonymous> (/mnt/var/vcap.local/dea/apps/opac-0-99a3338e073a0a5d12eec9c60e1a1f6b/app/node_modules/jquery/lib/node-jquery.js:9505:2)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:362:17)
at require (module.js:378:17)
at Object.<anonymous> (/mnt/var/vcap.local/dea/apps/opac-0-99a3338e073a0a5d12eec9c60e1a1f6b/app/parseHTML.js:1:71)

9 回复

从你提供的错误日志来看,问题出在 node-jquery 这个库试图访问浏览器环境中的 window 对象,但在 Node.js 环境中并不存在这个对象。node-jquery 是一个尝试将 jQuery 的 API 转换为可以在 Node.js 中使用的库,但它依赖于浏览器环境。

解决方案

1. 使用适合 Node.js 的替代库

你可以考虑使用 cheerio 这样的库来代替 node-jquerycheerio 提供了一个类似于 jQuery 的 API,但它是专门为 Node.js 设计的,并且不会尝试访问浏览器特有的全局变量。

示例代码

const cheerio = require('cheerio');

// 假设你有一个 HTML 字符串
const htmlString = '<html><body><h1>Hello World!</h1></body></html>';

// 使用 cheerio 加载 HTML
const $ = cheerio.load(htmlString);

// 选择元素并修改
$('h1').text('Hello Cheerio!');

// 输出修改后的 HTML
console.log($.html());

2. 配置 AppFog(如果需要)

如果你的应用确实需要某些特定的环境配置才能在 AppFog 上运行,可以检查是否有相关的环境变量或配置文件需要调整。例如,确保你的应用在部署时使用的是正确的 Node.js 版本。

总结

在 Node.js 项目中使用 node-jquery 可能会导致一些问题,因为 node-jquery 依赖于浏览器环境。使用 cheerio 这样的库可以解决这个问题,因为它提供了类似的 API 并且完全兼容 Node.js 环境。希望这个解决方案能够帮助你解决问题。


总让人怀疑是模块没有调用成功

是啊。但是本地都好好的啊。。。

我估计是node-jquery用到的那个contextify的问题, 它不是pure js的. 另外, contextify在64位的node上是无法使用的.

这个问题可能是你使用的是express 2吧,我也遇到过,现在解决了,不过方法忘记了。

你可以自己实现个 node-jquery,加强版的

我没用express, 我部署到heroku上,没有问题。

contextify的问题

在Node.js项目中使用node-jquery时,在本地运行正常,但部署到AppFog(或任何其他服务器环境)时出现错误。这种问题通常是因为node-jquery依赖于浏览器环境中的window对象,而在Node.js环境中并不存在这个对象。

问题原因

错误发生在尝试访问window.XMLHttpRequest时,而window对象在Node.js环境中是未定义的。node-jquery试图模拟浏览器环境,但在Node.js环境中无法找到window对象及其属性。

解决方案

一种解决方法是使用专门为Node.js设计的jQuery替代品,如cheerio,它提供了与jQuery类似的API,但没有浏览器依赖性。以下是替换步骤:

  1. 卸载旧的jQuery

    npm uninstall node-jquery
    
  2. 安装Cheerio

    npm install cheerio
    
  3. 修改你的代码

    • 假设你原来使用node-jquery的方式是这样的:

      const $ = require('node-jquery')();
      $('div').each(function() {
        console.log($(this).text());
      });
      
    • 使用Cheerio替换后,可以改为:

      const cheerio = require('cheerio');
      const html = '<html><body><div>Hello, world!</div></body></html>';
      const $ = cheerio.load(html);
      $('div').each(function() {
        console.log($(this).text()); // 输出 "Hello, world!"
      });
      

通过这种方式,你可以避免在Node.js环境中因为缺少window对象而导致的问题,并且仍然能够处理和解析HTML文档。

回到顶部