2013-05-28 48 views
4

我使用express.js作为网络服务器,并希望一个简单的方法来分离所有的“app.get”和“app.post”函数来分离文件。例如,如果我想为登录页面指定get和post函数,我想在动态加载的routes文件夹中有一个login.js文件(将自动添加所有文件,而不必指定每个文件)当我运行节点app.js动态加载路由与express.js

我试过这个this solution!,但它不适合我。

+1

链接的解决方案看起来像它应该工作;你能粘贴你的实现吗? – furydevoid

回答

14

app.js

var express=require("express"); 
var app=express(); 
var fs=require("fs"); 
var routePath="./routers/"; //add one folder then put your route files there my router folder name is routers 
fs.readdirSync(routePath).forEach(function(file) { 
    var route=routePath+file; 
    require(route)(app); 
}); 
app.listen(9123); 

我已经把下面两个路由器文件夹中

route1.js

module.exports=function(app){ 
    app.get('/',function(req,res){ 
    res.send('/ called successfully...'); 
    }); 
} 

route2.js

module.exports=function(app){ 
app.get('/upload',function(req,res){ 
    res.send('/upload called successfully...'); 
}); 
} 
+0

@anonymousfox你还有什么困难让我知道。 – sachin

+0

谢谢@sachin的帮助。我设法找到了一些工作,但与您提供的解决方案有点不同。当我尝试将相对路径“./routers/”传递给fs.readdirSync时,我收到一条错误,指出该目录不存在。如果我做了同样的事情,但使用了__dirname +“/ routes”,它能够工作。我遇到的第二个问题是,mac osx在我的routes文件夹中创建了.DS_Store文件。当路由被添加时,这个文件正在被解析,并最终引发错误。为了解决这个问题,我添加了一个检查来查看是否存在.js分机。 – anonymousfox

0

我结束了采用递归的方法来解决P中的代码可读性和异步:

// routes  
processRoutePath(__dirname + "/routes"); 

function processRoutePath(route_path) { 
    fs.readdirSync(route_path).forEach(function(file) { 
     var filepath = route_path + '/' + file; 
     fs.stat(filepath, function(err,stat) { 
      if (stat.isDirectory()) { 
       processRoutePath(filepath); 
      } else { 
       console.info('Loading route: ' + filepath); 
       require(filepath)(app, passport); 
      } 
     }); 
    }); 
} 

这可以由通过检查来回回正确的文件扩展名等更强大的,但我把我的路线文件夹干净,不希望增加的复杂性

0

通过这种方法,不需要手动编写路由。只需设置一个目录结构,如URL路径。路由示例为/routes/user/table/table.get.js,API路由为/user/table

import app from './app' 
import fs from 'fs-readdir-recursive' 
import each from 'lodash/each' 
import nth from 'lodash/nth' 
import join from 'lodash/join' 
import initial from 'lodash/initial' 

const routes = fs(`${__dirname}/routes`) 
each(routes, route => { 
    let paths = route.split('/') 

    // An entity has several HTTP verbs 
    let entity = `/api/${join(initial(paths), '/')}` 
    // The action contains a HTTP verb 
    let action = nth(paths, -1) 

    // Remove the last element to correctly apply action 
    paths.pop() 
    action = `./routes/${join(paths, '/')}/${action.slice(0, -3)}` 

    app.use(entity, require(action)) 
}) 

举例路线:

import { Router } from 'express' 
import Table from '@models/table.model' 

const routes = Router() 

routes.get('/', (req, res, next) => { 
    Table 
    .find({user: userIdentifier}) 
    .select('-user') 
    .lean() 
    .then(table => res.json(table)) 
    .catch(error => next(error)) 
}) 

module.exports = routes