代码中与主机无关的URL

时间:2016-02-23 15:32:56

标签: javascript node.js express

我需要我的应用程序发送电子邮件,其中包含指向其中应用程序的链接。无论运行哪个主机/端口/等,我如何形成链接?在一个地方,我这样做:

var urlToSend = req.protocol + '://' + req.get('host') + "some/path";

但在我的新案例中,我没有对req对象的简单访问权限。字符串操作似乎很愚蠢,容易出错。我认为,通过箍来获取请求会使情况变得更糟。

url helper functions in rails这样的nodejs中有什么东西吗?

2 个答案:

答案 0 :(得分:2)

查看Node中的url模块。 url.format()应该符合您的目的。例如,您可以执行以下操作:

'use strict';

const url = require('url');

// Just for example:
const PROTOCOL = 'https';
const HOST = 'some.host.com';
const PATH = 'some/path';

// ...

var urlToSend = url.format({
  protocol: PROTOCOL,
  host: HOST,
  pathname: PATH
});

// urlToSend = 'https://some.host.com/some/path'

您只需构建一个链接就不需要访问req对象。相关协议,主机,路径等应该都可以在您的应用中的某个位置使用,除非我对您的问题有所遗漏。

更新

我同意@MitchLillie您应该使用environment variables配置您的应用。我只是想我会扩展我在下面的评论中提出的建议。 Node中常见的模式是拥有一个专门用于配置的文件(或者可能是几个文件),例如设置主机,端口等。文件通常包含默认值,您可以选择使用环境变量覆盖这些值,如下所示:

// config.js

module.exports = {
  protocol: process.env.PROTOCOL || 'https',
  host: process.env.HOST || 'some.host.com',
  // ...
};

然后,只要您需要访问这些设置,就可以require('./config.js')。它有助于在应用程序增长时保持一致性,并在必要时轻松更改设置。

答案 1 :(得分:2)

查看这些URL帮助程序函数,我没有看到任何给你主机名。你是对的,从req.hostname捕获它有点草率。

我建议有条件地设置环境变量,只要您的设置不是太复杂。之后,使用McMath提及的url模块。

if (process.env.NODE_ENV === "production") {
  process.env.HOSTNAME = "site.com"
} else if (process.env.NODE_ENV === "development") {
  process.env.HOSTNAME = "localhost"
}