33

Node と Express を使用してアプリを作成しています。しかし、内部に配置されたすべてのルートを管理することは、すぐに困難になることがわかりますapp.js。すべてのモデルをサブディレクトリに配置しました/models

これが私のアプリの現在の構造です:

app.js
models
  -- products
  -- customers
  -- ...
public
views
node_modules

app.js

var express = require('express'),
    routes = require('./routes'),
    user = require('./routes/user'),
    http = require('http'),
    path = require('path'),
    EmployeeProvider = require('./models/employeeprovider').EmployeeProvider,
    Products = require('./models/products').Products,
    Orders = require('./models/orders').Orders,
    Customers = require('./models/customers').Customers,
    checkAuth = function(req, res, next) {
      if (!req.session.user_id) {
        res.send('You are not authorized to view this page');
      } else {
        next();
      }
    };

var app = express();

次にportviewsディレクトリ、レンダリング エンジンなどの設定を行います。

さらに下app.jsにルートがあります:

app.get('/product/edit', auth, function(req, res) {
  Products.findAll(function(error, prds) {
    res.render('product_edit', {
      title: 'New Product',
      products: prds
    });
  });
});

一番上で、の内容をmodels/products.js変数に代入していますが、すべて正常に動作します。ただし、すべてのルートを内部に保持することapp.jsは理想的ではありません。しかし、ルートを移動してモデルroutes/product.jsをロードすると:Products

var prod = require('../models/products.js');

object has no method というエラーが表示されますfindAll

私は何を間違っていますか?からルートを削除するにはどうすればよいapp.jsですか?

4

3 に答える 3

33

Express 4.x の時点でRouter、ケースをサポートするために追加されています。

ルーター オブジェクトは、ミドルウェアとルートの分離されたインスタンスです。これは、ミドルウェアとルーティング機能のみを実行できる「ミニ アプリケーション」と考えることができます。すべての Express アプリケーションには、アプリ ルーターが組み込まれています。

Expressjs サイトの例:

// routes/calendarRouter.js

var express  = require('express');
var router = express.Router();

// invoked for any requested passed to this router
router.use(function(req, res, next) {
  // .. some logic here .. like any other middleware
  next();
});

// will handle any request that ends in /events
// depends on where the router is "use()'d"
router.get('/events', function(req, res, next) {
  // ..
});

module.exports = router;

次に app.js で:

// skipping part that sets up app

var calendarRouter = require('./routes/calendarRouter');

// only requests to /calendar/* will be sent to our "router"
app.use('/calendar', calendarRouter);

// rest of logic
于 2014-04-15T07:49:43.023 に答える