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

时间:2013-08-30 13:51:05

标签: javascript node.js cross-platform

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

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

如果没有针对此的节点API(我确定不会有),那么我是否可以通过调用系统命令从节点执行此操作?

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

4 个答案:

答案 0 :(得分:21)

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

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

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

编写库来执行此操作并不是非常困难。

视窗

在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以运行节点,而不仅仅是直接运行应用程序。

Original MSDN article

请注意,这需要管理员权限并在系统范围内设置处理程序。要按用户执行此操作,您可以使用HKEY_CURRENT_USER\Software\Classes代替Electron的实现does it

苹果:

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

Apple Dev Documentation

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

以下Super User Question有更好的解决方案,但是是按用户设置。

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

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

的Linux:

据我所知,有几种方法可以在Linux中实现这一点(惊喜?)

Gnome有一个工具,可以让你注册一个网址处理程序w3 archives

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协议处理程序。

“为各种方案的URI创建伪mime类型,如下所示: 应用程序/ x-XDG-协议 - 支持特定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 forums

希望有所帮助。

答案 1 :(得分:3)

以下是我在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
    

    X 替换为您的应用程序名称。

    将脚本另存为 Application Bundle

  2. 转到脚本,然后右键单击' 显示包内容'然后编辑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开头的链接:并看到您的应用正在打开!

答案 2 :(得分:1)

我为此制作了一个 npm 模块。

链接:https://www.npmjs.com/package/protocol-registry

因此,要在 nodejs 中执行此操作,您只需要运行以下代码:

首先安装它

npm i protocol-registry

然后使用下面的代码来注册您的条目文件。

const path = require('path');

const ProtocolRegistry = require('protocol-registry');

console.log('Registering...');
// Registers the Protocol
ProtocolRegistry.register({
    protocol: 'testproto', // set your app for testproto://**
    command: `node ${path.join(__dirname, './index.js')}`, // this will be executed with a extra argument %url from which it was initiated
}).then(async () => {
    console.log('Successfully registered');
});

然后假设有人打开 testproto://test 然后将启动一个新终端执行:

node yourapp/index.js testproto://test

答案 3 :(得分:-17)

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

您似乎只想从网络浏览器启动节点包。 从Web浏览器启动外部程序的常用方法是编写浏览器插件。

这是pdf,torrent,iTunes从您的浏览器启动的方式。

总而言之,要做你想做的事,你必须编写一个插件并让你的用户安装。我想说的不是一个好主意。