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

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

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

如果没有一个节点API(我敢肯定不会有),那么有没有办法通过调用系统命令从节点执行?

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

这是一个有趣的想法。 我不认为目前有一个跨平台的node.js解决scheme。 我遇到过这样的人,他们要求同样的事情:

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

Electron现在支持macOS和Windows的app.setAsDefaultProtocolClient API( 自v0.37.4以来 )。

写图书馆来做这件事并不难。

Windows

在Windows端,您必须将应用程序注册为处理该URIscheme的应用程序。

您需要为您的应用程序设置一个registry项:

 HKEY_CLASSES_ROOT
   警报
       (默认)=“URL:警报协议”
       URL协议=“”
      的DefaultIcon
          (默认)=“alert.exe,1”
      贝壳
         打开
            命令
                (默认)=“C:\ Program Files \ Alert \ alert.exe”“%1”

然后,当您的应用程序由Windows运行时,您应该能够在process.argv[]看到参数。 确保启动一个shell来运行节点,而不是直接运行你的应用程序。

原始的MSDN文章

请注意,这需要pipe理员权限并设置系统范围的处理程序。 要做到这一点,每个用户可以使用HKEY_CURRENT_USER\Software\Classes来代替,就像Electron的实现一样 。

苹果:

引用的github中的“OS X”文章实际上是针对iOS的。 关于注册一个应用程序来处理URLscheme的信息,我会看看下面的编程指南:

Apple Dev文档

总之,您需要创build一个启动服务,并使用CFBundleURLTypes填充.plist文件,这个字段是一个数组,并且应该填充协议名称,例如http

下面的超级用户问题有更好的解决scheme,但是是每个用户设置。

“你要找的文件是〜/ 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 

一些轻量级pipe理者看起来像允许你创build假的MIMEtypes并将它们注册为URI协议处理程序。

“假的MIMEtypes是为这样的各种scheme的URI创build的:application / x-xdg-protocol-支持特定的URI协议的应用程序可以在他们的桌面条目文件中添加假的MIMEtypes到他们的MimeType键。通过查看mimeinfo.cache文件,将所有安装在系统上的应用程序支持一个URIscheme。再次,defaults.list文件可以用来指定一个默认的指定URItypes的程序。 wiki.lxde.org

KDE也支持自己的URL协议处理器处理方法:

创build一个文件: $KDEDIR/share/services/your.protocol并填入相关数据:

 [协议]
 exec = / path / to / player“%u”
协议= LastFM等
input=无
输出=无
助手=真
上市=
读= FALSE
写= FALSE
 MAKEDIR = FALSE
删除= FALSE

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

希望有所帮助。

以下是我在Mac OS上使用应用程序NW.js所做的工作:

  1. 打开应用程序/Applications/Utilities/Script Editor

    在编辑器中键入以下代码

     on open location this_URL do shell script "/Applications/X.app/Contents/MacOS/x '" & this_URL & "'" end open location 

    Xreplace为您的应用程序的名称。

    将脚本另存为应用程序包

  2. 转到脚本,右键单击“ Show Package Contents ”,然后编辑Contents/info.plist

    </dict></plist>之前的文件末尾添加这些行:

     <key>CFBundleIdentifier</key> <string>com.mycompany.AppleScript.AppName</string> <!-- edit here --> <key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleURLName</key> <string>AppName</string> <!-- edit here --> <key>CFBundleURLSchemes</key> <array> <string>myurlscheme</string> <!-- your url scheme here --> </array> </dict> </array> 
  3. 你现在可以打开一个从myurlscheme开始的链接并看到你的应用程序正在开放!

首先创build你自己的协议是疯狂的,不要这样做。

看起来你想要做的就是能够从networking浏览器启动你的节点包。 从networking浏览器启动外部程序的正常方式是编写一个浏览器插件。

这是如何PDF,山洪,iTunes从您的浏览器启动。

所以总而言之,要做你想做的事情,你将不得不编写一个插件,并让你的用户进行安装。 不是一个好主意,我会说。