3

こんにちは、

最近、Node.js + Express + MongoDB を使い始めました。以下を含むシンプルなアプリをセットアップしました。

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')
  , mongoose = require('mongoose')
  , models = require('./models')
  , Document
  , db;

// lots of conf ...

models.defineModels(mongoose, function() {
  app.Document = Document = mongoose.model('Document');
  db = mongoose.connect(app.set('db-uri'));
})

// Routes

app.get('/', routes.home);
app.get('/documents.:format?', routes.list);

// classical end of app.js

また、「routes」フォルダー内に対応する「index.js」ファイルがあり、以下を含みます。

exports.home = function(req, res){
  res.render('index', { title: 'Indx' })
};

exports.list = function(req, res){
    Document.find().all(function(documents) {
        switch (req.params.format) {
            case 'json':
                res.send(documents.map(function(d) {
                    return d.__doc;
                }));
            break;
            default:
                res.render('index', { title: 'Indx' });
        }
    });
};

ルーティング部分は問題ありません。つまり、ブラウザで localhost:3000 を指定すると、(Jade テンプレートで生成された) 'index' ビューが表示されます。localhost:3000/documents を指すと、ルーティングは正常に機能し、コードは「index.js」ルートの「リスト」部分を提供しようとしています。ただし、メイン アプリで作成した「Document」マングース モデルが「index.js」内で認識されることを期待していましたが、次のエラーが発生し続けるため、明らかにそうではありません。

Express
500 ReferenceError: Document is not defined
at C:\PERSO\DEV\indxjs\routes\index.js:23:2
at callbacks (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:272:11)
at param (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:246:11)
at param (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:243:11)
at pass (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:253:5)
at Router._dispatch (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:280:4)
at Object.handle (C:\PERSO\DEV\indxjs\node_modules\express\lib\router\index.js:45:10)
at next (C:\PERSO\DEV\indxjs\node_modules\express\node_modules\connect\lib\http.js:204:15)
at Object.methodOverride [as handle] (C:\PERSO\DEV\indxjs\node_modules\express\node_modules\connect\lib\middleware\methodOverride.js:35:5)
at next (C:\PERSO\DEV\indxjs\node_modules\express\node_modules\connect\lib\http.js:204:15)

次のようなものを使用して、「app.js」内からルーティングを明らかに定義できます。

app.get('/documents.:format?', loadUser, function(req, res) {
    // ...
}

しかし、'app.js' から './routes/index.js' をエレガントに分離しながら、マングースと対話する方法を誰でも見られるでしょうか?

どうもありがとう

EDIT : Wes からの親切な回答に従って、次のコードを「index.js」に追加しました。

var Document;
function defineRoutes(mongoose, fn) {
  Document = mongoose.model('Document');
  fn();
}
exports.defineRoutes = defineRoutes;
// then the same as in initial post

そして、「app.js」のこの関数内にルーティング定義を含めました。

routes.defineRoutes(mongoose, function() {
  app.get('/', routes.home);
  app.get('/documents.:format?', routes.list);
})

localhost:3000 を指すときはすべて問題ありませんが、/documents を指すと、ブラウザーはロード、ロードを続けます...

4

2 に答える 2

2

ウェス・ジョンソンのおかげで、私は自分の道を見つけました。私は、MongoDb の廃止されたメソッドを使用した古いチュートリアルをやみくもに従っていました。以下は、「ドキュメントのリスト」機能を実装するために最終的に使用したコード スニペットです。

exports.list = function(req, res){
    Document.find({},function(err, documents) {
        switch (req.params.format) {
            case 'json':
                res.send(documents.map(function(d) {
                    return d.toObject();
                }));
            break;
            default:
                res.render('index', { title: 'Indx' });
        }
    });
};

もう一度、ウェスに感謝します!

于 2012-06-09T12:40:58.237 に答える
1

ノード モジュールは、変数のスコープに関して自己完結型です。あなたが言及Documentしたように、あなたのオブジェクトにはアクセスできませんindex.js。これをルート ロジックに渡すか、マングース自体を渡す必要があります。

require呼び出しはほとんどの場合キャッシュされるため、ファイルに mongoose を要求しindex.jsて のインスタンスを取得するというDocument選択肢が 1 つあります。

Documentで実際には使用しないためapp.js、いつでも db 構成を別のモジュールに移動し、重要な参照をそれらを必要とするスクリプトにエクスポートして戻すことができます。

于 2012-06-08T16:39:50.257 に答える