【问题标题】:How to organize routing in fastify?如何在 fastify 中组织路由?
【发布时间】:2020-03-27 20:34:25
【问题描述】:

请原谅我发表这些异端言论,但从开发人员体验的角度来看,我认为 express 是构建 api 的最佳库。但阻止我在任何地方使用它的原因是每个人都一直在说(并通过基准测试确认)它很慢。

我尝试为自己选择一个替代方案,但我找不到适合我的。

以 express 为例,我可以简单地组织以下结构:
userAuthMiddleware.js

export const userAuthMiddleware = (req, res, next) => {
    console.log('user auth');
    next();
};

adminAuthMiddleware.js

export const adminAuthMiddleware = (req, res, next) => {
    console.log('admin auth');
    next();
};

setUserRoutes.js

export const setUserRoutes = (router) => {
    router.get('/news', (req, res) => res.send(['news1', 'news2']));
    router.get('/news/:id', (req, res) => res.send(`news${req.params.id}`));
};

setAdminRoutes.js

export const setAdminRoutes = (router) => {
    router.post('/news', (req, res) => res.send('created'));
    router.put('/news/:id', (req, res) => res.send('uodated'));
};

userApi.js

imports...

const userApi = express.Router();

userApi.use(userAuthMiddleware);
// add handlers for '/movies', '/currency-rates', '/whatever'
setUserRoutes(userApi);

export default userApi;

server.js

imports...

const app = express();

app.use(bodyparser); // an example of middleware which will handle all requests at all. too lazy to come up with a custom

app.use('/user', userApi);
app.use('/admin', adminApi);

app.listen(3333, () => {
    console.info(`Express server listening...`);
});

现在我很容易将处理程序添加到不同的“区域”,这些处理程序将通过必要的中间件。 (例如,用户和管理员授权的逻辑完全不同)。但是我在一个地方添加了这个中间件,不再考虑它,它就可以工作。

在这里,我试图在fastify 上组织一个类似的灵活路由结构。到目前为止,我还没有成功。要么文档小气,要么我不够细心。

通过 'use' 添加的 Fastify 中间件从 http 库而不是从 fastify 库获取 req 和 res 对象。因此,使用它们不是很方便-将某些东西从身体中拉出来,这将是一个完整的故事。

请给出一个fastify中的路由示例,比官方文档详细一点。例如,类似于我在 express 上使用用户和管理员的示例。

【问题讨论】:

    标签: node.js express routes middleware fastify


    【解决方案1】:

    我这样组织我的路线:

    fastify.register(
      function(api, opts, done) {
        api.addHook('preHandler', async (req, res) => {
          //do something on api routes
          if (res.sent) return //stop on error (like user authentication)
        }) 
    
        api.get('/hi', async () => {
          return { hello: 'world' }
        })
    
        // only for authenticated users with role.
        api.register(async role => {
           role.addHook('preHandler', async (req, res) => {
             // check role for all role routes
             if (res.sent) return //stop on error
           }) 
    
           role.get('/my_profile', async () => {
             return { hello: 'world' }
           })
    
        })
    
        done()
      },
      {
        prefix: '/api'
      }
    )
    

    现在所有对 api/* 的请求都将由 fastify 处理。

    【讨论】:

    • @muturgan 和 ofc 你可以像这样从单独的文件中注册路由:api.register(require('./routes/users'))。在这里阅读更多:fastify.io/docs/latest/Routes
    猜你喜欢
    • 2019-12-26
    • 2011-06-03
    • 2014-01-19
    • 1970-01-01
    • 2016-10-28
    • 1970-01-01
    • 2023-02-02
    • 2014-02-05
    • 1970-01-01
    相关资源
    最近更新 更多