2

いくつかのものをグローバルに定義しようとしています (アンダースコア ライブラリ、マングース、データベース接続、最終的にはアクセス許可オブジェクト)

app.js

/* module dependencies */
const express = require('express');
const auth = require('http-auth');
const underscore = require('underscore');
const expressValidator = require('express-validator');
const mongo = require('mongodb');
const db = require('./library/db');
/*end module dependencies */


/*routes files*/
const post = require('./routes/post');
/* end route files */


/* start the app instance */
var app = express();


/* authentication */
var basic = auth({
  authRealm : "Private area.",
  authList : ['Shi:many222', 'Lota:123456']
});
/* end authentication*/


/* pass app as an argument to the use method */
app.configure(function () {
  app.use(express.logger('dev'));
  app.use(express.bodyParser());
  app.use(expressValidator);
  app.use(db);
  //app.use(underscore);
  /* config debugging */
  app.configure('development', function(){
    app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
  });
  /* production instance */
  app.configure('production', function(){
    app.use(express.errorHandler());
  });
  /* end config debugging */
});


/* start route management */
app.get('/post', function(req, res) {
  basic.apply(req, res, function(username) {
    post.use(app);
    post.findAll(req, res);
  });
});
app.get('/post/:id', function(req, res) {
  post.findById(req, res);
});


/* port management */
var port = 8000;
app.listen(port);
console.log('Listening: port: '+port);

post.js

    // Module dependencies
const underscore = require("underscore");


// placeholder for app instance
var app;


// add a use function to exports that we can access from our app
exports.use = function (appInstance) {
  // make app instance available in post.js
  app = appInstance;
};


/* find all rows */
exports.findAll = function(req, res) {
  console.log('Post:findAll');
  app.db.collection('Post', function(err, collection) {
    collection.find({},{limit: 100}).toArray(function(err, items) {
      res.send(exports.parseModels(items));
    });
  });
};


/* parse a single or all items passed to it for formatting */
exports.parseModels = function (items) {
  underscore.each(items, function(key, val) {
    console.log('underscore parsed an object');
  });
  return items;
};

db.js

var mongo = require('mongodb');

var Server = mongo.Server,
  Db = mongo.Db,
  BSON = mongo.BSONPure;

var server = new Server('localhost', 27017, {auto_reconnect: true});
var db = new Db('website', server);

db.open(function(err, db) {
  if(!err) {
    //do an error here
  }
});

exports.db = db;

DB を正しいスコープで取得する際に問題が発生しています。現在、post.js 内でクエリが呼び出されると、次のエラーが発生します。

    ost:findAll
TypeError: Cannot call method 'collection' of undefined
    at Object.exports.findAll (/Github/-api-v3/routes/post.js:19:10)
    at /Github/-api-v3/app.js:53:10
    at Basic.apply (/Github/-api-v3/node_modules/http-auth/lib/auth/basic.js:48:4)
    at /Github/-api-v3/app.js:51:9
    at callbacks (/Github/-api-v3/node_modules/express/lib/router/index.js:161:37)
    at param (/Github/-api-v3/node_modules/express/lib/router/index.js:135:11)
    at pass (/Github/-api-v3/node_modules/express/lib/router/index.js:142:5)
    at Router._dispatch (/Github/-api-v3/node_modules/express/lib/router/index.js:170:5)
    at Object.router (/Github/-api-v3/node_modules/express/lib/router/index.js:33:10)
    at next (/Github/-api-v3/node_modules/express/node_modules/connect/lib/proto.js:199:15)
4

1 に答える 1

2

すべてのモジュールは、独自のスコープを持つクロージャーで実行されます。つまり、定義した変数は、そのモジュール内でのみアクセス可能になります。外部から見えるようにしたいメソッドや変数は、module.exportsオブジェクトに追加する必要があります。

本当にグローバル変数を定義する必要がある場合は、それをプロパティとしてglobalオブジェクトに追加する必要がありますが、これは最小限に抑える必要があります。

これを行う適切な方法は、使用するすべてのモジュール内で依存モジュールを要求することです。したがって、アンダースコアを参照する場合はvar _ = require("underscore");in にする必要があります。post.js_

post.jsインスタンスを認識する必要がある場合は、オブジェクト forappで使用できる関数に引数として渡す必要があります。module.exportspost.js

post.js

// Module dependencies
const _ = require("underscore");

// placeholder for app instance
var app;

// add a use function to exports that 
// we can access from our app
exports.use = function (appInstance) {
    // make app instance available in post.js
    app = appInstance;
    // app.db is also accessible
}

// add the rest of the methods here

app.js

// Module dependencies
const express = require('express');
const auth = require('http-auth');
const _ = require('underscore');
const expressValidator = require('express-validator');
const post = require('./routes/post');

// create app instance
var app = express();

// require db into app.db
app.db = require("./db");

// pass app as an argument to the use method
post.use(app);

注: 通常の変数/インスタンスと区別しやすくするために、依存関係に const を使用することを好みます。exportsまた、 の省略形であることに注意してくださいmodule.exports

于 2013-01-08T19:30:51.843 に答える