如何使用NodeJS和Express从app.js中分离路由和模型 [英] How to separate the routes and models from app.js using NodeJS and Express

查看:127
本文介绍了如何使用NodeJS和Express从app.js中分离路由和模型的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用Node和Express创建一个应用程序。但是,我可以看到很快就会很难管理放在 app.js 内的所有路由。我把所有的模型放在子目录 / models 中。



这是我的应用程序当前结构:

  app.js 
模型
- 产品
- 客户
- .. 。
public
查看
node_modules

app.js

  var express = require('express'),
routes = require('./ routes'),
user = require('./ routes / user'),
http = require('http'),
path = 'path'),
EmployeeProvider = require('./ models / employeeprovider')。EmployeeProvider,
产品= require('./ models / products')。产品,
订单= require ('./models/orders').Orders,
Customer = require('./ models / customers')。客户
checkAuth = function(req,res,next){
if(!req.session.user_id){
res.send('你无权查看此页面');
} else {
next();
}
};

var app = express();

然后一些配置,如 port 视图目录,渲染引擎等。



进一步向下 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 并加载产品型号:

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

我收到一个错误,表示该对象没有方法 findAll



我做错了什么?如何从 app.js 中删除​​路线?

解决方案

As的快递4.x 路由器被添加以支持您的情况。


路由器对象是中间件和路由的孤立实例。您可以将其视为微型应用程序,只能执行中间件和路由功能。每个Express应用程序都有一个内置的应用路由器。


expressjs网站

  // routes / calendarRouter.js 

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

//为任何请求传递给该路由器
router.use(function(req,res,next){
// ..这里有一些逻辑..像任何其他中间件
next();
});

//将处理结束于/ events
//的任何请求取决于路由器在哪里use()d
router.get('/ events' ,function(req,res,next){
// ..
});

module.exports = router;

然后在app.js中:

  //跳过部分设置app 

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

//只有/ calendar / *的请求将被发送到我们的路由器
app.use('/ calendar',calendarRouter);

//其余逻辑


I'm creating an app using Node and Express. However, I can see it'll soon become difficult to manage all the routes that are placed inside app.js. I have placed all my models in a subdirectory /models.

Here's my app current structure:

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

In 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();

Then some configuration like port, views directory, rendering engine, etc.

Further down app.js I've got the routes:

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

At the top I'm assigning the contents of models/products.js to a variable, all works fine. However keeping all routes inside app.js is not ideal. But if I move the routes to routes/product.js and load the Products models:

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

I get an error saying that object has no method findAll.

What am I doing wrong? How can I remove the routes from app.js?

解决方案

As of express 4.x Router is added to support your case.

A router object is an isolated instance of middleware and routes. You can think of it as a "mini-application," capable only of performing middleware and routing functions. Every Express application has a built-in app router.

Example from expressjs site:

// 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;

Then in 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

这篇关于如何使用NodeJS和Express从app.js中分离路由和模型的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆