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

Dan*_*eld 20 javascript cross-platform node.js

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

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

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

它必须适用于Windows,Linux和MacOS.

jer*_*emy 22

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

https://github.com/rogerwang/node-webkit/issues/951
Run Code Online (Sandbox Code Playgroud)

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[].确保启动shell以运行节点,而不仅仅是直接运行应用程序.

原MSDN文章

请注意,这需要管理员权限并在系统范围内设置处理程序.要做到这一点每个用户,您可以使用HKEY_CURRENT_USER\Software\Classes,而不是作为电子的实现做它.

苹果:

github评论中引用的"OS X"文章实际上是针对iOS的.我将查看以下编程指南,了解有关注册应用程序以处理URL方案的信息:

Apple Dev文档

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

以下超级用户问题有一个更好的解决方案,但是是每用户设置.

"您寻找的文件是〜/ Library/Preferences/com.apple.LaunchServices.plist.

它包含一个名为LSHandlers的数组,定义LSHandlerURLScheme的Dictionary子句可以使用LSHandlerRole进行相应的修改."

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
Run Code Online (Sandbox Code Playgroud)

一些较轻的管理器看起来像允许您创建假的mime类型并将它们注册为URI协议处理程序.

"伪造的mime-types是为各种方案创建的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论坛

希望有所帮助.