在Azure的IISNode上调用localhost URL

时间:2015-10-12 20:27:32

标签: node.js azure routing iisnode

由于IISNode,我在Azure WebSites上运行Node应用程序时遇到了一些问题。基本上问题是我依赖端口号是一个数字,坦率地说在Azure上不是这种情况......这里端口号实际上是一个命名管道,其值为\\.\pipe\76deda07-ef5c-4539-87d8-755ede772521。因此,以下代码将内部请求路由回localhost上定义的HTTP路由,但不起作用:

function getFromLocalRoute(restPayloadObject, callback) {

    request.get({
        uri : util.format('http://localhost:%s/api/%s', app.config.port, restPayloadObject.servicepath),
        json : true
    }, callback);
}

毫无疑问,这在* nix系统上运行良好,但现在我需要找到一种很好的处理方式,这种方法也适用于Windows。

我所追求的基本上是这样的:

  1. 我在localhost上有一个网址
  2. 我想使用此网址
  3. 在localhost上调用网址
  4. 必须使用IISNode
  5. 它不必使用HTTP。我只是想重用通过使用Express处理我的路由逻辑,解析所有内容,将其发送到正确的模块等隐含的逻辑。所以如果有一种方法可以在不使用HTTP的情况下调用Express Router

    相关:

2 个答案:

答案 0 :(得分:0)

Windows Azure网站使用IISNode在IIS内部托管Node进程。您的Node站点实际上是一个命名管道,它接收传入的请求,而不是像在本地运行或自己托管时使用的TCP端口。即使你可以打开一个TCP端口,Azure网站实际上只适用于传统网站,而且没有办法向外界开放端口。

因为我们会收到如下错误消息: Error: connect EACCES 127.0.0.1:80 at Object.exports._errnoException (util.js:837:11) at exports._exceptionWithHostPort (util.js:860:20) at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1060:14)

作为一种解决方法,如果您需要的URL在您的expressjs项目中,您可以利用res.redirect或自定义内置函数来处理params。或者,您可以将项目迁移到Azure VM,从而为您的需求提供更大的灵活性。

答案 1 :(得分:0)

我发布了与此问题相关的another question,我发现了适用于此问题的体面编程解决方案。

事实证明,可以通过使用带有存根请求和响应对象的(非公共/非官方)express.Router方法直接调用Router#handle。有关该方法的详细信息,请参阅this answer

It turned out命名管道方法不可行,因此直接调用路由器似乎最适合手头的问题。