【问题标题】:"ReferenceError: <functionName> is not defined" : libraries issue?“ReferenceError:<functionName> 未定义”:库问题?
【发布时间】:2015-02-23 05:23:29
【问题描述】:

我对 node.js 非常非常陌生,我很可能会问一个非常简单的问题。

客户端:我已经能够通过 d3js 制作出色的 maps on client side,基于定制的 ./js/wikiatlas.js (here)。

服务器端:我现在想移动这个地图生成服务器端。我使用 node、jsdom 和 d3js 成功输出了一个基本的 square.svg。我现在想使用来自./js/wikiatlas.js 的更复杂的函数。所以我天真地添加了 ./js/wikiatlas.js 依赖和 js 函数调用 locationMap("body",800, target, title, WEST, NORTH, EAST, SOUTH); 期望它工作(其他事情肯定工作)。我的完整代码:

var jsdom = require('jsdom');
var fs    = require('fs');
jsdom.env(
  "<html><body></body></html>",        // CREATE DOM HOOK:
  [ '../js/jquery-2.1.3.min.js', 
  '../js/d3.v3.min.js', 
  '../js/topojson.v1.min.js', 
  '../js/wikiatlas.js',             // <<======== my code (IMPORTANT !!)
  '../js/b64.js'],                  // ... & offline
//'http://rugger-demast.codio.io/js/wikiatlas.js',
  function (err, window) {
/* COLLECT ENV.VARIABLES ******************************************* */
    var WEST  = process.env.WEST,     
        NORTH = process.env.NORTH,
        EAST  = process.env.EAST,
        SOUTH = process.env.SOUTH,
        target= process.env.ITEM,
        title = process.env.ITEM,
        WIDTH = process.env.WIDTH;

/* D3js FUNCTION *************************************************** */
locationMap("body",800, target, title, WEST, NORTH, EAST, SOUTH); // <<======== defined in wikiatlas.js!

/* SVG PRINT ******************************************************* */
    var svgheader = '<?xml version="1.0" encoding="utf-8"?>'
    +'<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">';
    fs.writeFileSync('administrative_map_(wikiatlas_2014).svg', svgheader + window.d3.select("body").html());
    // console.log(window.d3.select("body").html());
 }
// END (D3JS) * * * * * * * * * * * * * * * * * * * * * * * *
);

然后我得到 ReferenceError: locationMap is not defined 错误:

/data/yug/projects_active/make-modules/09_d3/location.node.js:30
locationMap("body",800, target, title, WEST, NORTH, EAST, SOUTH);
^
ReferenceError: locationMap is not defined
    at Object.done (/data/yug/projects_active/make-modules/09_d3/location.node.js:30:1)
    at /data/yug/projects_active/make-modules/node_modules/jsdom/lib/jsdom.js:270:18
    at process._tickCallback (node.js:419:13)
make: *** [output] Error 8

我应该如何加载或设置 ./js/wikiatlas.js 以便我可以在我的 node.js / jsdom 服务器脚本上使用其中的函数?


似乎与:In Node.js, how do I "include" functions from my other files?Nodejs script fails to print after d3.json()?有关

【问题讨论】:

  • var wikiatlas = require('path/to/wikiatlas.js')
  • 添加了 var wikiatlas = require('../js/wikiatlas.js') ,同样的错误。是否有特定的语法来调用库中的函数(例如locationMap())?
  • 添加 var wikiatlas = require('../js/wikiatlas.js') 是不够的,如果你走这条路,你还必须将你的脚本转换为 nodejs module.export 格式。此外,它还利用了在客户端和服务器端使用单一代码的优势。

标签: node.js node-modules jsdom


【解决方案1】:

由于您将脚本加载到窗口的上下文中,您还必须使用窗口访问它,即window.locationMap

jsdom.env(
  "<html><body></body></html>",        // CREATE DOM HOOK:
  [ '../js/jquery-2.1.3.min.js', 
  '../js/d3.v3.min.js', 
  '../js/topojson.v1.min.js', 
  '../js/wikiatlas.js',             // <<======== my code (IMPORTANT !!)
  '../js/b64.js'],

然后

window.locationMap("body",800, target, title, WEST, NORTH, EAST, SOUTH);

就是这样。

【讨论】:

  • 谢谢,你的答案就是它!
猜你喜欢
  • 1970-01-01
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2020-10-22
  • 1970-01-01
  • 2015-10-04
相关资源
最近更新 更多