Nodejs 第一次尝试发布npm,简化Express路由配置并添加拦截器功能的Rainbow

Nodejs 第一次尝试发布npm,简化Express路由配置并添加拦截器功能的Rainbow

安装:

$ npm install rainbow

项目主页:https://github.com/mytharcher/rainbow

中文介绍:发布npm包Rainbow

欢迎各位围观指正!


Update

0.0.2 (2012-12-11)

  • 修复自定义相对路径容错问题。

0.1.0 (2012-12-24)

  • 新增params方式配置参数化URL支持。
  • 修复不区分get/post/put/delete路由时的filter支持问题。

11 回复

Nodejs 第一次尝试发布npm,简化Express路由配置并添加拦截器功能的Rainbow

安装:

$ npm install rainbow

项目主页: https://github.com/mytharcher/rainbow

中文介绍: 发布npm包Rainbow

欢迎各位围观指正!


更新日志

0.0.2 (2012-12-11)

  • 修复自定义相对路径容错问题。

0.1.0 (2012-12-24)

  • 新增params方式配置参数化URL支持。
  • 修复不区分get/post/put/delete路由时的filter支持问题。

简介

Rainbow 是一个旨在简化 Express 路由配置并提供拦截器功能的 npm 包。通过使用 Rainbow,你可以更方便地管理你的路由,并且能够轻松地添加各种拦截器来处理请求。

安装与初始化

首先,你需要在你的项目中安装 Rainbow:

$ npm install rainbow

然后,在你的 Express 应用中引入并初始化 Rainbow:

const express = require('express');
const rainbow = require('rainbow');

const app = express();

// 初始化 Rainbow
rainbow.init(app);

配置路由

Rainbow 提供了简洁的方式来配置路由。你可以使用 route 方法来定义路由,并且可以为不同的 HTTP 方法(如 GET、POST 等)指定不同的处理函数。

app.route('/hello')
    .get((req, res) => {
        res.send('Hello, World!');
    })
    .post((req, res) => {
        res.send('Hello, POST request!');
    });

添加拦截器

Rainbow 还允许你添加拦截器来处理请求。拦截器可以在请求到达实际的处理函数之前或之后执行。

app.use(rainbow.interceptor((req, res, next) => {
    console.log(`Request received at ${new Date()}`);
    next();
}));

app.route('/secure')
    .get((req, res) => {
        res.send('This is a secure route.');
    });

在这个例子中,我们添加了一个拦截器,它会在每次请求到达 /secure 路由之前打印当前时间。

参数化 URL 支持

Rainbow 还支持参数化 URL,你可以使用 params 方式来配置这些路由。

app.route('/user/:id')
    .get((req, res) => {
        res.send(`User ID: ${req.params.id}`);
    });

在这个例子中,/user/:id 是一个参数化 URL,其中 :id 是一个动态参数。当用户访问 /user/123 时,req.params.id 将会是 123


希望这个简短的介绍能帮助你更好地理解和使用 Rainbow。欢迎提出任何问题或建议!


首先非常感谢高手提供的轮子,但是看完介绍后还是不太会用~~比如我有3个action:/update,/delete,/add,就是微博的修改、删除和增加,我希望对这3个action设置登录拦截而比如/reg,/login这两个action不设置拦截应该怎么做,还有就是如果我给这三个不但要设置登录拦截还想在设置一个字符拦截给/update,/add,这两个action的话可以吗

可能我文档里的例子没说明白。

根据你的情况,首先把update.js等3个action放到controllers/目录,另外,我觉得你说的登录拦截,应该是一个跳转吧,那么reg.jslogin.js也应该是真实的action,也应该放到controllers/下。

这时设计你的登录拦截器,比如叫authorization.js,放到filters/目录下,内容:

module.exports = function (req, res, next) {
    if (!req.session.user) {
        res.redirect('/login'); // session中没有user认为是没有登录,跳到注册页
    } else {
        next(); // 通过的话继续后续操作
    }
};

controllers/update.js里这么写:

exports.post = function (req, res, next) {
    // 通过拦截器后你自己的业务逻辑
    res.send(200, 'OK');
};
// 添加拦截器,指明通过登录验证才可以继续
exports.post.filters = ['authorization'];

还要加其他拦截器的话都可以在filters数组里加,会顺序执行。

不知道说明白没,你可以再试试。

差不多清楚了 这样的话其实也是针对每一个action的跳转逻辑方法,后面都跟着一句拦截他的拦截器集合(exports.post.filters = ['authorization'])代码是吧,也就是比如我那3个action每个后面都要紧跟着写,如

exports.update= function (req, res, next){...}
exports.update.filters = ['authorization'];

exports.delete= function (req, res, next){…} exports.delete.filters = [‘authorization’];

exports.add= function (req, res, next){…} exports.add.filters = [‘authorization’];

是这样吗

现在考虑支持/:id类型的URL映射,想征集下大家需求。如果是只有一个参数的话应该很容易改进,但同一个URL上有多个类型的话API设计就比较麻烦。

我想知道单一参数是否可以满足90%的情况?

我提个建议吧,既然你已经封装了express的路由那么可以利用express的路由方法,express里面已经定义了 params 的参数规则。可以依靠自己编写正则表达式来限制路由参数的类型。假如想要加进去把他封装成api应该就可以了。 仅仅是个建议。我也只是看过那部分express的源码。

已经完成支持字符串和正则方式配置的params解析,详细使用见Rainbow中文文档

赞 补上测试,模块就完整了.

东东不错,但是发布到npm中要让人放心使用,单元测试和持续集成是需要的。可以参见https://github.com/JacksonTian/unittesting 补上测试。

感谢指导!不过毕竟开源的东西没有太多精力来维护,我有时间的时候再去研究下测试框架。

对于标题为“Nodejs 第一次尝试发布npm,简化Express路由配置并添加拦截器功能的Rainbow”的帖子,下面是关于该库的详细使用说明和示例代码。

安装

你可以通过以下命令来安装 rainbow

npm install rainbow

使用方法

基本路由配置

假设你已经有一个基本的Express应用,你可以使用rainbow来简化路由配置,并添加拦截器功能。以下是如何设置的基本步骤:

const express = require('express');
const rainbow = require('rainbow');

const app = express();

// 定义一个简单的拦截器
function loggingInterceptor(req, res, next) {
    console.log(`Handling ${req.method} request for ${req.url}`);
    next();
}

// 创建并注册路由规则
const routes = rainbow({
    '/hello': {
        method: 'GET',
        handler: (req, res) => {
            res.send('Hello World!');
        }
    },
    '/bye': {
        method: 'POST',
        handler: (req, res) => {
            res.send('Goodbye!');
        }
    },
    // 更多路由...
});

// 将路由注册到Express应用中
routes.forEach(route => {
    route.middleware.push(loggingInterceptor);
    app[route.method.toLowerCase()](route.path, route.middleware, route.handler);
});

app.listen(3000, () => {
    console.log('Server is running on port 3000');
});

路由参数化

你可以使用 params 方法来处理带有参数的URL,例如 /user/:id。以下是具体的实现:

const routesWithParams = rainbow({
    '/user/:id': {
        method: 'GET',
        params: ['id'],
        handler: (req, res) => {
            res.send(`User ID: ${req.params.id}`);
        }
    }
});

routesWithParams.forEach(route => app[route.method.toLowerCase()](route.path, route.middleware, route.handler));

通过这种方式,你可以轻松地创建和管理路由,并且能够添加通用的拦截器功能,如日志记录或认证检查。

总结

rainbow 是一个轻量级的模块,用于简化Express应用中的路由配置,并提供了方便的方法来添加和管理拦截器。这使得你的代码更加整洁、易于维护。

回到顶部