我没有使用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-第二个错误,我没有提示为什么会发生这种情况。
请帮助
答案 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);
// ...
};