当前位置: 首页 > 面试题库 >

如何在Node.js中注册URL协议处理程序

仇阳州
2023-03-14
问题内容

我正在开发命令行节点模块,希望能够通过网站上的链接启动它。

我想注册一个自定义协议my-module://,以使链接具有以下格式:my-module://action:some- action单击它们将启动节点包。

如果没有为此的节点API(我确定不会),那么有什么办法可以通过调用系统命令从node做到这一点?

它必须在Windows,Linux和MacOS上运行。


问题答案:

这是一个有趣的想法。我认为目前没有跨平台的node.js解决方案。我确实遇到了要求同一件事的人们:

https://github.com/rogerwang/node-webkit/issues/951

Electron现在通过适用于macOS和Windows
app.setAsDefaultProtocolClientAPI(自v0.37.4起)支持它。

编写该库并不难。

Windows

在Windows方面,您必须将应用程序注册为处理该URI方案的应用程序。

您需要为您的应用程序设置一个注册表项:

      HKEY_CLASSES_ROOT
      alert
      (Default) = "URL:Alert Protocol"
      URL Protocol = ""
      DefaultIcon
         (Default) = "alert.exe,1"
      shell
         open
            command
               (Default) = "C:\Program Files\Alert\alert.exe" "%1"

然后,当您的应用程序由Windows运行时,您应该能够看到中的参数process.argv[]。确保启动外壳程序以运行节点,而不仅仅是直接运行应用程序。

MSDN原始文章

请注意,这需要管理员特权并在系统范围内设置处理程序。要针对每个用户执行此操作,您可以HKEY_CURRENT_USER\Software\Classes改为使用它,就像Electron的实现那样。

苹果:

github注释中引用的“ OS X”文章实际上是针对iOS的。我将查看以下编程指南,以获取有关注册应用程序以处理URL方案的信息:

AppleDev文档

总之,您将需要创建启动服务,并使用填充.plist文件CFBundleURLTypes。此字段是一个数组,应仅使用协议名称填充,即http

以下超级用户问题是一种更好的解决方案,但是是针对每个用户的设置。

“您要查找的文件是〜/ Library / Preferences / com.apple.LaunchServices.plist。

它包含一个名为LSHandlers的数组,并且可以使用LSHandlerRole相应地修改定义LSHandlerURLScheme的Dictionary子级。

Linux:

据我所知,在Linux中有几种方法可以做到这一点(惊奇吗?)

Gnome有一个工具,可以让您注册一个URL处理程序W3存档

gconftool-2 -t string -s /desktop/gnome/url-handlers/tel/command "bin/vonage-call %s"
gconftool-2 -s /desktop/gnome/url-handlers/tel/needs_terminal false -t bool
gconftool-2 -t bool -s /desktop/gnome/url-handlers/tel/enabled true

一些较轻的重量管理器看起来像它们使您可以创建伪造的mime类型并将其注册为URI协议处理程序。

“伪造的mime类型是使用以下各种方案为URI创建的:application / x-xdg-protocol-
支持特定URI协议的应用程序可以在其桌面项文件中将伪造的mime类型添加到其MimeType密钥中。因此很容易找到通过查看mimeinfo.cache文件,找出安装在支持URI方案的系统上的所有应用程序。再次使用defaults.list文件为指定的URI类型指定默认程序。”
wiki.lxde.org

KDE还支持它们自己的处理URL协议处理程序的方法:

创建一个文件: $KDEDIR/share/services/your.protocol并用相关数据填充它:

[Protocol]
exec=/path/to/player "%u"
protocol=lastfm
input=none
output=none
helper=true
listing=
reading=false
writing=false
makedir=false
deleting=false

来自所有地方的last.fm论坛

希望有帮助。



 类似资料:
  • 问题内容: 我试图为类路径协议注册自定义URL处理程序,如另一个线程所述。这是代码: 该测试用例具有以下JVM参数: 该行正确输出,因此正在设置属性。但是,由于上面的调用将引发异常,因此它似乎没有生效。 如果我像注释行中那样显式提供处理程序,则一切都很好。但是,我不想明确提供它-它应该自动完成。 我究竟做错了什么? 问题答案: 我发现了问题。我使用的原始类路径处理程序类具有非默认构造函数。当然,因

  • 注册自定义协议并拦截现有协议请求 进程: 主进程​ 实现类似 file:// 协议的小例子 : 1 const {app, protocol} = require('electron') 2 const path = require('path') 3 app.on('ready', () => { 4 protocol.registerFileProtocol('atom', (request,

  • 注册协议 点击进入注册协议页面 1、协议标题:输入协议内容的标题。 2、协议内容:添加协议内容,编辑栏可以对内容进行设置。

  • 问题内容: 应该很容易: 但是这样就不会调用拦截器。 问题答案: 默认情况下,Spring将注册,和,而无需任何显式配置。 如果您定义自己的bean,那么默认的bean将不会被注册,而您只会得到显式声明的bean。 到目前为止,一切都很好。 当您添加到混合中时,问题就来了。这 也 声明了自己的,它取代了默认值。但是,如果您也声明自己的一个,那么最终您将声明两个。由于按照声明的顺序进行查询,因此通常

  • 问题内容: 我正在编写一个Web服务器,其中需要在运行时注册处理程序。例如,“ / create”将为所有URL(例如“ / 123 / ”等)创建一个新的处理程序。我需要一个相应的“ / destroy / 123”,它将为“ / 123 / ”注销处理程序。 这是用于处理“ / create”的代码 我尝试通过嵌入来实现自己的多路复用器,但它在私有变量()中保留了其模式到处理程序的映射 问题答

  • 问题内容: 我收到此异常: 源自此代码: 哪里是。 所以这对我来说很好- 我知道数据库中存在零日期,我需要能够读取这些日期并将其转换为下游数据结构中的适当数据(可能为空)。问题是我不知道如何检索它并得到“软”错误。我考虑过将这一行包装在SQLException的try / catch中,但了解这会破坏ResultSet的有效性。 是否有可能以其他方式读取此值而不会引发SQLException? 问