app.listen() 和 app.get() 如何在express和hapi上工作

2023-12-26

使用 http 节点模块(仅限本机模块),我如何重新创建 app.listen() 和 app.get() 使用带有构造函数的 http 模块

var app = function(opts) { 
    this.token= opts.token
} 

app.prototype.get = function(callback) {
    // use request and response of app.listen()
}

app.prototype.active = function(callback) {
   // use request and response of app.listen()
   // return on callback some manipulate 
   //request params
}


app.prototype.listen = function() {
    // start http or https server 
}

导入模块并使用它

var app = require(...)

Var client = new app({
    token: 0000
})

client.get(function(error, reply) {})
client.listen()

在 Node 的 http 模块之上构建您自己的非常简单的 HTTP 框架非常容易。这是我制作的一个快速的实现app.get() and app.listen()方法,你可以看到它如何发展成为更像 Express 的东西:

'use strict';

const Http = require('http');
const Url = require('url');

// Framework

const Framework = function (options) {

    this.options = options;
    this.routes = [];
    this.listener = Http.createServer(this._onRequest.bind(this));
};

Framework.prototype.get = function (path, handler) {

    this.routes.push({ path, method: 'GET', handler });
};

Framework.prototype.post = function (path, handler) {

    this.routes.push({ path, method: 'POST', handler });
};

Framework.prototype.listen = function (callback) {

    this.listener.listen(this.options.port, callback);
};

Framework.prototype._onRequest = function (req, res) {

    // Find the first matching route

    for (let i = 0; i < this.routes.length; ++i) {
        const route = this.routes[i];
        const url = Url.parse(req.url);
        if (route.method === req.method && url.path === route.path) {
            return route.handler(req, res);
        }
    }

    // No matching routes

    res.writeHead(404);
    res.end('Not found');
};

您可以像这样使用这个迷你框架:

const app = new Framework({ port: 4000 });

app.get('/', (req, res) => {

    res.end('Home page');
});

app.get('/about', (req, res) => {

    res.end('About page');
});

app.listen(() => {

    console.log('Started server!');
});

您可以使用一些 cURL 请求来测试它:

$ curl -i http://localhost:4000/

HTTP/1.1 200 OK
Date: Sun, 24 Apr 2016 14:38:02 GMT
Connection: keep-alive
Content-Length: 9

Home page

$ curl -i http://localhost:4000/about

HTTP/1.1 200 OK
Date: Sun, 24 Apr 2016 14:38:08 GMT
Connection: keep-alive
Content-Length: 10

About page

$ curl -i http://localhost:4000/spaghetti

HTTP/1.1 404 Not Found
Date: Sun, 24 Apr 2016 14:38:14 GMT
Connection: keep-alive
Transfer-Encoding: chunked

Not found

显然,这是一个非常基本的框架,并且遇到了 hapi 等框架已经解决的许多问题:

  • 不支持路径中的参数,例如/users/{id}。 URL 路径必须与路由路径完全匹配
  • 添加路由的顺序很重要(这可能会导致问题)
  • 允许冲突的路径
  • 缺少很多不错的功能,例如服务文件和渲染模板(尽管您可以在处理程序中手动执行此操作)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

app.listen() 和 app.get() 如何在express和hapi上工作 的相关文章

随机推荐

  • WebClient:忽略 HTTP 500

    我正在编写一个程序 它从服务器检索一些数据 对其执行一些操作 并将输出保存到 csv 文件 我遇到的问题是服务器 我不负责 总是返回 HTTP 500 内部服务器错误 我已经与负责该问题的团队进行了交谈 虽然他们意识到了该错误 但他们表示该
  • 为什么不在生产环境中使用 Django 提供静态文件?

    我遇到了以下示例settings py if settings DEBUG urlpatterns static settings MEDIA URL document root settings MEDIA ROOT 并被告知 stati
  • PCL kd-tree 实现速度极慢

    我正在使用基于点云库 PCL 的 C 实现 kd 树最近邻 NN 搜索 该数据集包含约 220 万个点 我正在为每个其他点搜索 NN 点 搜索半径设置为 2 0 要完全计算出来 大约需要 12 个小时 我使用的是带有 4GB RAM 的 W
  • Windows 窗体在 Visual Studio 窗体设计器中消失了

    昨天我在 Visual Studio 的表单设计器中编辑了一个表单 当我今天回到它时 设计师什么也没展示 我可以打开属性窗口 选择所有不同的组成组件并编辑它们的属性 但它们没有显示 应用程序构建良好 表单可以照常运行 我尝试了几种不同的解决
  • 邮递员脚本:“pm 未定义”

    我尝试在 Postman 中编写一个预请求脚本 我想提出请求 所以我尝试使用pm sendRequest https www getpostman com docs postman scripts postman sandbox api r
  • Node.js 流/管道错误处理(错误时更改响应状态)

    我的 Cassandra 数据库中有数百万行 我想以 zip 文件的形式流式传输到客户端 不希望内存中存在巨大的 zip 文件 我正在使用 Cassandra Node 驱动程序中的 Stream 函数 通过管道传输到 Transforme
  • 参数不是 NaNunction,未定义

    我正在从 AngularJS 1 2 26 迁移到 1 3 2 并收到 这不是最好的错误消息 但看起来好像是说我的控制器未定义 我可以不再以这种方式定义控制器吗 错误 错误 areq 糟糕的论点 参数 welcomeController 不
  • 无法让 cocoon 在 Ruby on Rails 4 上工作

    在过去的几个小时里 我一直在努力让这个工作正常进行 但由于某种原因我做不到 我几乎完全按照 github 存储库链接上指示的步骤进行操作 我使用以下所有步骤创建了一个新应用程序 rails new demo app cd demo app
  • Firemonkey ScrollBox 错误

    我们在 Firemonkey 的 ScrollBox 组件中遇到了一个奇怪的错误 因为TGrid继承自TScrollBox它也会影响所有网格 在我们的一些开发机器上 一切正常 而在其他机器上 就会出现错误 我们未能检测到系统之间的任何模式
  • 在 /admin/ 安装 jinja2 TemplateDoesNotExist 后

    我已经安装了 jinja2 之后 DIRS 停止工作 我必须手动包含它们 更改 APP DIRS 没有帮助 模板看起来像这样 TEMPLATES BACKEND django template backends jinja2 Jinja2
  • LESS - 多个不同的类具有相同的风格?

    你会如何用 LESS 写出下面这种风格 nav a hover nav a focus footer a hover footer a focus fullscreen container a hover fullscreen contai
  • Ansible:如何将默认值应用于列表的每个复杂参数

    我有以下列表和默认变量 my list complex key1 val1 key2 val2 key3 val3 keyN valN key1 val1 key3 val3 keyN valN key2 default2 key3 def
  • 如何确定Microsoft Edge是否是默认浏览器?

    是否有可靠的编程方式来确定 Microsoft Edge 是默认浏览器 我知道一种选择是使用IApplicationAssociationRegistration QueryCurrentDefault https msdn microso
  • 如何在 Laravel 9 Validation 中实现上述验证?

    我正在尝试实现某些 Laravel 验证标准 但我很难实现这些标准 请同样帮助我 我正在使用 laravel 9 和 PHP 8 1 描述 我有一个 API 其中包含以下提到的输入 A 公司名称 必填b company number 根据条
  • 使用 telegram bot API 创建新组

    如何使用 Telegram 中的机器人创建新群组 据我所知 机器人本身无法做到这一点 那么是否有可能将机器人实现为常规程序user How Update 这就是我要的http t me polyglossia http t me polyg
  • 为数据网格行创建上下文菜单

    我有一个可能有很多行的数据网格 当用户右键单击其中一行时 我需要为每一行显示一个上下文菜单 并在用户单击该选项时执行一个操作 相同的操作 但根据当前选定的行不同的数据项 对此最好的策略是什么 我担心每一行的 ContextMenu 都太过分
  • preRenderView 禁用 ajax

  • typedef struct 与 Object - 优点

    我计划定义一个类 其属性中包含 x y 网格的坐标 但是 我不确定实现此设计的 最佳 方法 这是一个很简单的问题 我只想正确地做并有一个理由 一种解决方案是拥有两个属性 类型为 int 一个用于 x 一个用于 y 在对象内 另一种是定义一个
  • 在 Django 中获取自己的应用程序

    有没有一种方法可以获取属于 Django 项目本身的应用程序列表 忽略安装的应用程序 pip 换句话说 我可以排除安装的应用程序吗 pip from settings INSTALLED APPS 您可以使用以下方式获取所有 django
  • app.listen() 和 app.get() 如何在express和hapi上工作

    使用 http 节点模块 仅限本机模块 我如何重新创建 app listen 和 app get 使用带有构造函数的 http 模块 var app function opts this token opts token app proto