我需要我的应用程序发送电子邮件,其中包含指向其中应用程序的链接。无论运行哪个主机/端口/等,我如何形成链接?在一个地方,我这样做:
var urlToSend = req.protocol + '://' + req.get('host') + "some/path";
但在我的新案例中,我没有对req
对象的简单访问权限。字符串操作似乎很愚蠢,容易出错。我认为,通过箍来获取请求会使情况变得更糟。
像url helper functions in rails这样的nodejs中有什么东西吗?
答案 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"
}