我希望能够使用Node HTTP API处理自定义URL方案。我想在网页内写这样的链接:bb
。我想让Node HTTP Request Handler接收这种URL。
当我在我的网址中尝试这种自定义协议时,Chrome似乎没有发送请求,因为它格式不正确。所以在Node中我的HTTP服务器没有任何东西。
是否可以将HTTP服务器绑定到自定义URL方案或协议,如app://foo/bar
?
答案 0 :(得分:1)
只有某些协议(例如http://
和https://
)才会发送到您的nodejs http服务器。这就是问题所在。您的node.js服务器是一个http服务器。 Chrome浏览器只会使用它知道属于http服务器的http协议发送URL。
首先必须在浏览器中使用浏览器插件处理自定义协议,然后可以决定如何处理它。
您可能想要做的是自定义HTTP URL,例如:
http://yourserver.com/foo/bar
然后,您的node.js http服务器将获得请求的/foo/bar
部分,您可以为此编写自定义处理程序。
回顾一下,://
之前部分的URL的第一部分是协议。这告诉浏览器该URL应该与哪个协议一起使用。如果没有浏览器插件,浏览器只会支持某些内置协议,例如http
,https
,ws
,wss
,mailto
和其他一些人。
http服务器只能响应http协议,因此它只能用于希望使用http协议且浏览器知道使用http协议的URL。因此,您自己的浏览器不知道的协议不是浏览器知道如何处理的。它需要一个浏览器插件来告诉浏览器如何为自定义URL做什么。
当我尝试使用这种网址时,看起来Chrome似乎正在击打它,然后才能进入我在Node中的HTTP服务器。
是的,它不是浏览器中内置的可识别协议,因此浏览器不知道如何处理它或如何说出该协议。
是否可以将HTTP服务器绑定到这样的自定义URL方案?
仅使用浏览器加载项来注册并实现对自定义URL协议的支持。
答案 1 :(得分: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', // sets protocol for your command , testproto://**
command: `node ${path.join(__dirname, './index.js')} $_URL_`, // $_URL_ will the replaces by the url used to initiate it
override: true, // Use this with caution as it will destroy all previous Registrations on this protocol
terminal: true, // Use this to run your command inside a terminal
script: false
}).then(async () => {
console.log('Successfully registered');
});
然后假设有人打开 testproto://test 然后将启动一个新终端执行:
node yourapp/index.js testproto://test
答案 2 :(得分:0)
基于另一个答案的评论主题,我想我明白你要做的是什么。
我听说您要在localhost
之外提供一些文件,但根本不会污染现有网络服务器的命名空间。
我有几种奇怪的替代解决方案:
Host:
标头,并在符合您的特殊主机名的情况下提供文件。