NodeJS- ReferenceError:未定义wagner

时间:2016-03-24 02:33:28

标签: node.js

我没有使用nodejs的经验而且我正在学习。我有一个代码,我正在测试并给我以下错误,我不明白为什么:

1)第3部分评估测试"之前"钩:      ReferenceError:未定义wagner       在对象。 (fx.js:2:31)       在对象。 (dependencies.js:3:10)       在上下文。 (test.js:29:20)

2)第3部分评估测试"毕竟"钩:      TypeError:无法读取属性'关闭'未定义的       在上下文。 (test.js:65:11)

这些是涉及该问题的程序:

test.js --------------

var assert = require('assert');
var express = require('express');
var fs = require('fs');
var status = require('http-status');
var superagent = require('superagent');
var wagner = require('wagner-core');

var URL_ROOT = 'http://localhost:3000';
var PRODUCT_ID = '000000000000000000000001';

describe('Part 3 Assessment Tests', function() {
  var server;
  var app;
  var succeeded = 0;
  var finalCharge;

  var Category;
  var Config;
  var fx;
  var Product;
  var Stripe;
  var User;

  before(function() {
    app = express();

    // Bootstrap server
    models = require('./models')(wagner);
    dependencies = require('./dependencies')(wagner);

    // Make models available in tests
    var deps = wagner.invoke(function(Category, fx, Product, Stripe, User, Config) {
      return {
        Category: Category,
        fx: fx,
        Product: Product,
        Stripe: Stripe,
        User: User,
        Config: Config
      };
    });
...

dependencies.js -------------

var wagner = require('wagner-core');
var fs = require('fs');
var fx = require('./fx')(wagner);
var Stripe = require('stripe');

module.exports = function(wagner) {
  var stripe = 

  // TODO: Make Stripe depend on the Config service and use its `stripeKey`
  // property to get the Stripe API key.
  wagner.factory('Stripe', function() {
    return Stripe(Config.stripeKey);
  });

  wagner.factory('fx', fx);

  wagner.factory('Config', function() {
    return JSON.parse(fs.readFileSync('./config.json').toString());
  });

  var Config = wagner.invoke(function(Config) {
      return Config;
   });
}; 

fx.js --------------------------

var superagent = require('superagent');
var _ = require('underscore')(wagner);

module.exports = function(Config) {
...
};

我认为我不应该有任何问题,因为wagner在test.js上定义并作为参数传递给dependencies.js,并且它将它传递给fx.js.

1-你能告诉我代码中有什么问题吗? 2-第二个错误,我没有提示为什么会发生这种情况。

请帮助

2 个答案:

答案 0 :(得分:4)

在你的dependencies.js中,在fx定义中,你不需要传递wagner作为参数,因为那个变量不存在:

var fx = require('./fx');

正如我所看到的,你已经定义了Config工厂,你不需要将它分配给一个变量来使用它,因为wagner会自动注入你的" Config"工厂,允许您访问它:

wagner.factory('Stripe', function(Config) {
    return Stripe(Config.stripeKey);
});

...

wagner.factory('Config', function() {
   return JSON.parse(fs.readFileSync('./config.json').toString());
});

然后在你的fx.js中,当你想使用Config参数时,你只需传递它:

module.exports = function(Config) {
    var url = 'http://openexchangerates.org/api/latest.json?app_id=' +
    Config.openExchangeRatesKey;
 ...
}

如果你想使用" Config"你应该做的完全相同工厂在任何其他文件中:

[auth.js]
function setupAuth(User, Config, app) {
    ...
}

答案 1 :(得分:0)

您在执行导出的函数之前尝试在fx.js中使用wagner,并且在传递wagner的范围之外。另外,Config如果您将wagner传递给该函数,则会有点误导。

如果您可以延迟加载下划线,您可以执行以下操作:

var superagent = require('superagent');
var _;

module.exports = function(Config) {
  if (!_)
    _ = require('underscore')(Config);
  // ...
};