我正在开发一个命令行节点模块,并希望能够通过网站上的链接启动它。
我想注册一个自定义协议my-module://
,以便链接具有以下格式:my-module://action:some-action
并点击它们将启动节点包。
如果没有针对此的节点API(我确定不会有),那么我是否可以通过调用系统命令从节点执行此操作?
它必须适用于Windows,Linux和MacOS。
答案 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以运行节点,而不仅仅是直接运行应用程序。
请注意,这需要管理员权限并在系统范围内设置处理程序。要按用户执行此操作,您可以使用HKEY_CURRENT_USER\Software\Classes
代替Electron的实现does it。
苹果:
github评论中引用的“OS X”文章实际上是针对iOS的。我将查看以下编程指南,了解有关注册应用程序以处理URL方案的信息:
总之,您需要创建一个启动服务并使用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应用程序的方式:
打开应用/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
转到脚本,然后右键单击' 显示包内容'然后编辑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>
您现在可以打开以 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从您的浏览器启动的方式。
总而言之,要做你想做的事,你必须编写一个插件并让你的用户安装。我想说的不是一个好主意。