V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
huyinjie
V2EX  ›  Node.js

请问如果将一个 express 主文件分成多个

  •  
  •   huyinjie · 2019-09-09 08:50:04 +08:00 · 5705 次点击
    这是一个创建于 1935 天前的主题,其中的信息可能已经有所发展或是发生改变。

    感觉启动文件里的 express 路由过多,写的时候把各个页面的功能( SQL 查询修改什么的)都写进去了,请问下有什么分离出去的写法吗? 主文件代码在这边 https://pastebin.com/vfL0emzY

    15 条回复    2019-09-21 18:07:13 +08:00
    niknik
        1
    niknik  
       2019-09-09 08:53:11 +08:00   ❤️ 1
    一楼坐等二楼回答
    onfuns
        2
    onfuns  
       2019-09-09 09:00:46 +08:00   ❤️ 1
    const app = express()
    require('./a')(app)

    //a 文件为函数
    module.exports = function a(app){
    //相关逻辑
    }
    Kusoku
        3
    Kusoku  
       2019-09-09 09:02:22 +08:00   ❤️ 1
    在别的文件里写好处理方法,在需要的地方引入就行了啊
    app.get('/', function (req, res) {
    res.sendFile(path.join(__dirname + '/views/login.html'));
    });
    类似这个后面的处理函数就可以拿出去写在别的文件,一些公共的操作函数也是同理
    kzfile
        4
    kzfile  
       2019-09-09 09:08:51 +08:00   ❤️ 1
    const app = new express(),
    appUI = new express(),
    appAPI = new express();

    appUI.get("/", (req, res) => {
    res.redirect("/public/index.html");
    });
    appAPI.post("/user/login", (req, res) => {
    //...
    });

    app.use(['/api'], appAPI)
    app.use(appUI)
    app.server = app.listen(3000);
    VancleefL
        5
    VancleefL  
       2019-09-09 09:11:47 +08:00   ❤️ 1
    前段时间 app.js 写太大被 leader 批了,目前的解决办法是用 express.Router()拆分成子路由
    大概写法如下:

    //app.js
    const user = require('./router/user');
    const patient = require('./router/patient');

    app.use('/user',user)
    app.use('/patient',patient)

    //user.js
    const router = require('express').Router();

    router.get((req,res) => {});
    router.post((req,res) => {});
    VancleefL
        6
    VancleefL  
       2019-09-09 09:12:22 +08:00   ❤️ 1
    我也不确定我的写法是否合适,如果有问题希望各位大大指正一下
    justin2018
        7
    justin2018  
       2019-09-09 09:31:34 +08:00   ❤️ 1
    15651980765
        8
    15651980765  
       2019-09-09 10:19:46 +08:00   ❤️ 1
    @VancleefL 2333 我就是这样写的
    15651980765
        9
    15651980765  
       2019-09-09 10:24:14 +08:00   ❤️ 1
    话说楼主可以试试 Sequelize 框架,感觉自己写 SQL 会有很多冗余的代码。
    ruyuejun
        10
    ruyuejun  
       2019-09-09 10:33:53 +08:00   ❤️ 1
    实际的工程拆分问题像上面的方式并没有解决。
    app.js 里只用设置基础配置即可,
    然后引入一个路由主文件,如下所示:
    var routes = require('./routes');
    routes(app); // 加载路由

    路由主文件 routes.js 如下所示:
    var user = require('./routers/userRouter');
    var order = require('./routers/orderRouter');

    module.exports = function (app) {
    user(app);
    order(app);
    }

    这样具体某个路由就彻底从 app.js 、routes.js 这 2 个主文件中剥离,某个业务路由,比如 userRouter 如下:
    module.exports = function(app) {
    app.get("/user/login", login);
    app.get("/user/register", register);
    }
    orzorzorzorz
        11
    orzorzorzorz  
       2019-09-09 11:04:32 +08:00   ❤️ 1
    可以试试类 + 装饰器
    https://github.com/orzyyyy/memo/blob/master/server/utils/decorator.ts
    最后写成这样
    https://github.com/orzyyyy/memo/blob/master/server/controller/MainPageController.ts
    反正路由拆起来没完了,我的理解就是分类放就完,本身拆不拆无所谓
    Pi7bo1
        12
    Pi7bo1  
       2019-09-09 11:09:43 +08:00   ❤️ 1
    @VancleefL 我一直用的二楼那种写法 但是感觉你这种`优雅`些 学习了
    scyangjian
        13
    scyangjian  
       2019-09-09 11:29:00 +08:00   ❤️ 1
    B 站全栈之巅的教程你可以看看
    huyinjie
        14
    huyinjie  
    OP
       2019-09-09 23:12:18 +08:00
    @VancleefL #5 感谢,学习了
    xcstream
        15
    xcstream  
       2019-09-21 18:07:13 +08:00
    app 放在 global 上 哪个文件都可以用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3193 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:37 · PVG 20:37 · LAX 04:37 · JFK 07:37
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.