除非作为参数传入,否则无法添加快速路线

2024-03-18

我正在尝试创建映射其自己的路线的节点模块。我在下面提供了一个简化的示例(删除了返回的对象中映射的所有其他函数以及任何代码以简化示例)。

我最初的尝试是这样做:

文件:web-core.js

function initRoutes(app) {
  var express = require('express');  
  var router = express.Router();

  router.get("/basic", function(request, response) {
    response.json({ success: true, path: '/auth/basic' });
  });

  router.get("/oauth2", function(request, response) {
    response.json({ success: false, path: '/auth/oauth2' });
  });

  router.get("/openid", function(request, response) {
    response.json({ success: false, path: '/auth/openid' });
  });

  app.use('/auth', router); // mount the module
}

function init(app) {
  initRoutes(app);                     //-- This does work (but don't like it)
  //initRoutes(require('express')());  //-- This does NOT work!
}

module.exports = (function() {  
  return {    
    init : init
  };  
}());

从我的 Node 入口点:

var express = require('express');
var app = express();

app.use(express.static('public'));

var webAuth = require("./web-auth.js");

webAuth.init(app);  //-- Wish I didn't have to call this!

var listener = app.listen(process.env.PORT, function () {
  console.log('Your app is listening on port ' + listener.address().port);
});

现在,我的主要目标是不必打电话webAuth.init(app)(并间接使用initRoutes(require('express')());反而)。我希望该模块不依赖于显式或外部初始化。

但由于某种原因,当我使用initRoutes(require('express')());它就是行不通。似乎只有当我打电话时才有效webAuth.init(app)并传入app object.

我不确定我在这里缺少什么。我被告知 Node 将缓存返回的所有实例require('express'),因此从技术上讲,两种方法应该是相同的并且工作原理相同。

All the express.Router()我在网上看到的示例提供了简单的用例,而不是像我试图做的那样“模块化”。

有谁知道为什么它不起作用?


更新:2018.02.04 18:27

我创建了一个带有示例代码的 Glitch 项目,以便任何人都能理解,可以找到here https://glitch.com/edit/#!/jeach-node-modules?path=README.md:1:0.

似乎总是存在这样那样的问题。要么缺乏文档,要么一些神秘的“东西”不起作用。

因此,根据提供的答案,我决定从外部初始化,例如:

var webAuth = require("./web-auth.js");
webAuth.init(app, router);

在我的模块中,我现在有:

function init(app, router) {
  console.log("### Initializing '" + MODULE_NAME + "' module for '" + BASE_PATH + "'");

  initFilters(router);
  initRoutes(app, router);
}

这效果很好。当我打电话时GET /auth/basic,我的过滤器和/auth/*路线按预期工作。

但是现在,我开始创建第二个特定于域的模块,所以我们会说 API 应该映射到/domain/*。显然,第二个模块现在应该使用一个新实例express() and express.Router(), 不?否则重复使用相同的东西就没有意义了。

所以当我这样称呼时:

app = express();
router = express.Router();

var webDOMAIN= require("./web-domain.js");
webDOMAIN.init(app, router);

您希望该模块也可以在/domain/*路径...但事实并非如此!该死,使用 NodeJS 和 ExpressJS 真是令人沮丧。事实证明,在我 30 多年的经验中,我对这两种技术的体验似乎比其他任何技术都更令人沮丧。


更新:2018.02.06 10:59

好吧,我终于想通了!!!我不会将所有内容都发布在这里,而是对我自己的问题写一个广泛的答案。


可能同时有多个 Express 应用程序。因此,您需要找到合适的应用程序来分配路线。由于应用程序无法进行猜测,因此您需要告诉函数使用哪一个。

As @yue you https://stackoverflow.com/users/9053019/yue-you提及、致电require("express")()创建一个新的 Express 实例。这意味着,您必须在某个时间点传递正确的实例。

我的建议是摆脱该初始化函数,因为它实际上不是构造函数。您可以将初始化部分移至导出函数中,以便代码的工作方式就像快速初始化程序一样。这样,您还可以归档您想要的模块化。

网络身份验证.js

function init(app) {
  initRoutes(app);
}

module.exports = function(app) {  
  return init(app);
};

然后在您的代码中使用它,如下所示:

require("./web-auth.js")(app);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除非作为参数传入,否则无法添加快速路线 的相关文章

随机推荐

  • Statsmodels Poisson glm 与 R 不同

    我正在尝试根据 R 中提供的一些代码来拟合一些模型 空间交互模型 我已经能够在 python 框架中使用 statsmodels 使一些代码正常工作 但其中一些代码根本不匹配 我相信我的 R 和 Python 代码应该给出相同的结果 有人看
  • 非模板化成员函数的enable_if用法[重复]

    这个问题在这里已经有答案了 C 程序设计语言 第四版 一书 第28 4章 第796页 解释了enable if并给出了使operator gt 成为条件定义的示例 书中的例子只是一个代码片段 我将其完成为程序如下 include
  • lua __pairs 的实际实现是什么?

    有谁知道 lua 5 2 的实际实现吗 元方法 pairs 换句话说 我如何实施 pairs作为元表中的元方法 因此它的工作原理与pairs 我需要覆盖 pairs并想跳过我在表中添加的一些虚拟变量 下面将使用元表元来显式提供pairs默认
  • 更改数组适配器中列表项的文本颜色

    我创建一个列表视图并在自定义对话框中实现该列表视图 该列表视图使用数组适配器 在我的数组适配器中 我使用自己的布局和所需的颜色 代码如下 listView new ListView context ArrayAdapter
  • PHP Printf 作为浮点精度

    我正在尝试使用 PHPprintf功能打印出用户的存储容量 完整的公式看起来像这样 echo printf 02f size 1024 1024 GB 鉴于 size 10 1024 1024 这应该打印出来 10 00 GB 但事实并非如
  • 读取 byte[] 历史队列

    我正在尝试编写一个我知道数组大小的字节数组 但是我无法解析结果数据 我正在使用以下代码 okAppender writeBytes b gt b write byteData and byte byteData new byte 500 o
  • 如何在phpmyadmin中导入大型sql文件

    我想导入一个大约 12 mb 的 sql 文件 但它在加载时引起问题 有没有办法在不分割sql文件的情况下上传它 尝试根据您的操作系统的口味从 mysql 控制台导入它 mysql u DB USER NAME p DB NAME lt d
  • Spring Boot:禁用特定 URL 的客户端身份验证

    我的配置中有以下配置application yml server address port 8443 sessionTimeout 30 ssl client auth need key store keyStore jks key sto
  • Xamarin iOS 通用链接支持 Twitter 身份验证

    所以 现在 Twitter 从 9 月 25 日开始支持通用链接 这意味着当 UIWebView 命中时https twitter com oauth authorize oauth token https twitter com oaut
  • 仅根据字段名称对类数组进行排序

    我有一个应用程序 用户向我提供字段名称 例如name or costInCents 我必须按该字段排序 我有办法保证字段名称是正确的 这个应用程序导致了我根本无法上课的复杂情况Comparable并实施具体的compareTo 因为自定义实
  • 为用户定义类型实现 ToOwned

    考虑以下示例代码 derive Clone struct DataRef lt a gt text a str derive Clone struct DataOwned text String 我要实施ToOwned for DataRe
  • 如何让 iPhone 应用程序用户提交崩溃报告? [复制]

    这个问题在这里已经有答案了 可能的重复 iPhone如何获取客户的崩溃日志 https stackoverflow com questions 3844482 iphone how to get crash log from custome
  • 在 JavaScript 中,当完成通过 new ActiveXObject 创建的对象后,我是否需要将其设置为 null?

    在 WSH 中运行并创建对象 例如 Scripting FileSystemObject 或任何任意 COM 对象 的 Javascript 程序中 完成后是否需要将变量设置为 null 例如 我建议这样做 var fso new Acti
  • 如何将开始按钮放在剪辑的中间

    我在以下位置找到了设计师页面http www videojs com http www videojs com 在那里 您可以将开始按钮的位置更改为剪辑的中间 但我无法在 video js 播放器上放置或使用此样式表 有人可以解释一下如何在
  • C++ 中获取用户输入未执行/跳过的代码

    在下面的代码中 当我尝试让用户输入他们的名字时遇到错误 我的程序只是跳过它并直接进行函数调用 而不允许用户输入他们的名字 尽管出现错误 我的程序仍在编译 我不确定出了什么问题 因为我是根据在这里找到的其他示例编写该部分的 有什么建议么 in
  • 使用 Moneta (JavaMoney) JSR 354 实现自定义货币金额格式

    我真的很困惑如何定制MonetaryAmountFormat使用 Moneta JSR 354 实现 我的目的是能够解析两者1 23 and 3 45 as MonetaryAmounts 这是我的单元测试 Test public void
  • 从 WidgetKit 小部件扩展检测应用程序启动

    点击 WidgetKit 小部件会自动启动其父应用程序 如何检测我的应用程序是否是从其 WidgetKit 小部件扩展启动的 我无法找到任何有关在应用程序中捕获此内容的文档AppDelegate and or SceneDelegate 要
  • 如何使用参数和 POST 方法重定向到外部 url?

    我想在提交到 Flask 中的操作 url 之前保存表单数据
  • 如何在android中打开图库中的一个特定文件夹?

    我使用下面的代码打开 Android 默认图库应用程序 它会打开 sdcard 下的所有图像文件夹 如何只打开一个特定文件夹 Intent intent new Intent Intent ACTION PICK android provi
  • 除非作为参数传入,否则无法添加快速路线

    我正在尝试创建映射其自己的路线的节点模块 我在下面提供了一个简化的示例 删除了返回的对象中映射的所有其他函数以及任何代码以简化示例 我最初的尝试是这样做 文件 web core js function initRoutes app var