web-dev-qa-db-ja.com

Expressでのルートのグループ化

Laravelで次のようにルートをグループ化できます。

Route::group("admin", ["middleware" => ["isAdmin"]], function () {

     Route::get("/", "AdminController@index");
     Route::post("/post", ["middleware" => "csrf", "uses" => "AdminController@index");

});

基本的に、adminグループで定義されたすべてのルートは、isAdminミドルウェアとグループ名を自動的に取得します。たとえば、postエンドポイントはadmin/postではなく/postをリッスンします

Expressで同じことをする方法はありますか?私のLaravelルートは以前はとてもきれいでしたが、私のExpressルートは少し乱雑で重複しているので、それは素晴らしいでしょう。

これは、現時点でExpressにある私のroutes.jsです。

app.get("/admin", [passportConfig.isAuthenticated, passportConfig.isAdmin], AdminController.index);
app.post("/admin", [passportConfig.isAuthenticated, passportConfig.isAdmin], AdminController.postIndex);

ありがとうございました。

14
Aris

あなたがしたいすべてのグループの前にちょうど使用してください:

app.use('/admin', AdminMiddleware);
app.get('/admin/route1', ... 
app.get('/admin/route2', ... 

app.use('/user', UserMiddleware);
app.get('/user/route1', ...
app.get('/user/route2', ...
7
asanchez

app.use()を使用できます- https://expressjs.com/en/guide/using-middleware.html#middleware.application

app.use("/admin",[passportConfig.isAuthenticated, passportConfig.isAdmin],AdminController)


// AdminController:
var express = require('express');
var router = express.Router();
router.get('/', AdminController.index);
// etc...
module.exports = router

https://expressjs.com/en/guide/routing.html#express-router

7
jessh
var app = require('express');
require('express-group-routes');

app.group("/api/v1", (router) => {
    router.get("/login", loginController.store); // /api/v1/login 
});

プレフィックスを追加したくないが、特定のルートをグループ化する必要がある場合は、最初のパラメーターをそのままにして、関数に直接進むことができます。

 var app = require('express');
require('express-group-routes');

app.group((router) => {
    router.use(middleware);
});
5
yadav-durgesh

Express 4以降、ルーターを定義して構成できます

const app = require('express');
const adminRouter = app.Router();

adminRouter.use(isAdmin);
adminRouter.get('/', admin.index); /* will resolve to /admin */
adminRouter.post('/post', csrf, admin.index); /* will resolve to /admin/post */

app.use('/admin', adminRouter); 

お役に立てば幸いです。

5
Melle

私はあなたがこの方法に従うことができるより良い解決策を見つけましたそれはうまくいきます

ルートファイルroute/user.js

var express = require('express')
var router = express.Router()
const authMiddleware = require('../middleware/auth')

express.application.prefix = express.Router.prefix = function(path, middleware, configure) {
    configure(router);
    this.use(path, middleware, router);
    return router;
}


router.prefix('/user', authMiddleware, async function (user) {
    user.route('/details').get(function(req, res) {
        res.status(201).send('Hello this is my personal details')
    }); //also you can use controller method if you have any
});

module.exports = router //make sure you have to import/use this route in main/server js
0
bhavinjr

私はあなたの問題を解決するためにこのモジュールを書きました: https://github.com/benjamin658/express-inject-middleware

ミドルウェアを配列としてグループ化し、それをexpress-inject-middlewareに渡すことができます...

例えば:

import express from 'express';
import { injectMiddleware } from 'express-inject-middleware';

const app = express();

const authMiddleware = (req, res, next) => {
  // some auth logic...
};

const fooMiddleware = (req, res, next) => {
  // some foo logic
}

const barMiddleware = (req, res, next) => {
  // some bar logic
}

app.use(injectMiddleware(
  [
    authMiddleware,
    fooMiddleware,
  ],
  [
    // Passing the app.[METHOD] as the parameter.
    app.get('/secrets', (req, res, next) => res.send('secrets'));

    // Mount barMiddleware itself
    app.post('/secrets', barMiddleware, (req, res, next) => res.send('ok'));
  ],
));

これが結果です:

app.get('/secrets', authMiddleware, fooMiddleware, (req, res, next) => res.send('secrets'));
app.post('/secrets', authMiddleware, fooMiddleware, barMiddleware, (req, res, next) => res.send('ok'));
0
BenHu