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上工作 的相关文章

  • 使用 python requests 模块时出现 HTTP 503 错误

    我正在尝试发出 HTTP 请求 但当前可以从 Firefox 浏览器访问的网站响应 503 错误 代码本身非常简单 在网上搜索一番后我添加了user Agent请求参数 但也没有帮助 有人能解释一下如何消除这个 503 错误吗 顺便说一句
  • 如何使 d3 饼图响应式?

    我有一个 PIE 图表 它工作正常 但我无法使其具有响应能力和可调整大小 我需要它与移动浏览器和 iPad 等兼容 div div
  • 设置双指缩放时精确的滚动位置

    我正在创建一个地图应用程序 它将标记图像放置在画布上并滚动到它 我正在使用浏览器的捏缩放和滚动来放大 缩小地图 然而 我注意到有一些奇怪的行为 我想知道如何解决它 这有点难以解释 但我们开始吧 假设您处于网页的标准缩放级别 无法进一步缩小
  • 此页面上的脚本导致 ie 运行缓慢

    问题就在标题中 IE 行为异常 并说有一个脚本运行缓慢 FF 和 Chrome 没有这个问题 我怎样才能找到问题所在 那个页面有很多JS 手动检查不是一个好主意 EDIT 这是我正在处理的一个项目的页面 但我需要一个工具来查找问题 End
  • 检测 Google 验证码的挑战窗口何时关闭

    我正在使用谷歌隐形验证码 有没有办法检测挑战窗口何时关闭 我所说的挑战窗口是指您必须选择一些图像进行验证的窗口 目前 我在按钮上放置了一个旋转器 一旦单击按钮 就会呈现验证码挑战 无法向用户提示另一个质询窗口 我以编程方式调用渲染函数 gr
  • JS 保留以零结尾的小数[重复]

    这个问题在这里已经有答案了 在JavaScript中 是否可以 锁定 十进制数 以保留以零结尾的 浮点数 例如 我有 2 个不同的数字 如下所示 伪代码 let a 1 0 let b 1 00 a b true should be fal
  • JavaScript 将键添加到数组中的每个值

    我下面有这个数组 它由一个简单的数组组成 我想要完成的是放一把钥匙id在每个数组值前面以实现类似的效果 id a id b id c id d 有没有一种简单的方法可以做到这一点 任何帮助将不胜感激 谢谢 var test a b c d
  • Node.js 升级在 Windows 中仍然显示旧版本

    我已使用 msi 安装程序下载并安装了新版本的 nodejs 4 1 2 之后我跑了node v 但它仍然显示旧版本 0 12 2 我尝试重新启动Windows 甚至卸载nodejs并重新安装它 但仍然显示相同的内容 为什么会发生这种情况
  • 将 Firebase FCM 添加到 ReactJS 应用程序

    我正在尝试向我的 ReactJS 应用程序中的用户发送推送通知 我已添加 firebase 请求用户通知权限 这正在发挥作用 但现在我想注册设备令牌 但这给了我错误 消息传递 我们无法注册默认的 Service Worker 无法注册 Se
  • Meteor.setTimeout 和 Meteor.methods 之间的并发

    在我的 Meteor 应用程序中实现回合制多人游戏服务器 客户端通过发布 订阅接收游戏状态 并且可以调用 Meteor 方法sendTurn将回合数据发送到服务器 他们无法直接更新游戏状态集合 var endRound function g
  • 如何将 arraylist 从 servlet 传递到 javascript?

    我通过在属性中设置数组列表并将其转发到 jsp 来从 servlet 传递数组列表 Servlet ArrayList
  • javascript 是否有等效的 __repr__ ?

    我最接近Python的东西repr这是 function User name password this name name this password password User prototype toString function r
  • 扩展 RegExp 以获取文件扩展名

    我知道 已经有很多基于 RegExp 的解决方案 但是我找不到适合我需求的解决方案 我有以下函数来获取 URL 的各个部分 但我还需要文件扩展名 var getPathParts function url var m url match w
  • 语法错误:意外的标记“?”在 repl.it 上用 JavaScript 制作不和谐机器人时 [重复]

    这个问题在这里已经有答案了 我收到错误 const token this client token this client accessToken SyntaxError Unexpected token Discord 机器人代码 con
  • 使用socket.io进行用户身份验证

    我已经红色了这个教程 http howtonode org socket io auth http howtonode org socket io auth 它展示了如何使用express和socket io对用户进行身份验证 但是有没有一
  • 尝试使用 Javascript 解决对称差异

    我正在尝试找出对称的解决方案 使用 javascript 完成以下任务的差异 目标 接受未指定数量的数组作为参数 保留数组中数字的原始顺序 不删除单个数组中数字的重复项 删除数组中出现的重复项 因此 例如 如果输入是 1 1 2 6 2 3
  • 以角度访问窗口 TemplateUrl 内的范围

    我的模式有一个 windowTemplateUrl 如下 div class modal fade div class modal dialog div class modal content square btn div div div
  • ng-include 和 ng-view 不同时加载

    下面是我的应用程序的结构 很简单 页眉和页脚是非常小的文件 而主页上的 ng view 要大得多 当我进入该页面时 我注意到了这一点 首先加载两个 ng include 然后 ng view 出现 页脚被推到底部 页脚闪烁大约 0 1 秒
  • 确定 Javascript 中的日期相等性

    我需要找出用户在 Javascript 中选择的两个日期是否相同 日期以字符串 xx xx xxxx 形式传递给该函数 这就是我需要的全部粒度 这是我的代码 var valid true var d1 new Date datein val
  • 如何映射轮播的子项数组?

    我正在尝试将 Carousel 组件包装在映射对象数组周围作为组件的子级 目前我只能让映射创建映射对象的 1 个子对象 轮播需要像这样

随机推荐

  • 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