当前位置: 首页 > 面试题库 >

IIS,Node.js和带有IISNode的Web应用程序未通过虚拟目录正确配置

上官锦
2023-03-14
问题内容

我在IIS中具有以下设置:

  • 默认网站(www.foo.com)托管标准html网站
  • 运行IIS节点的默认网站(www.foo.com/bar)下的Web应用程序
  • 节点项目正在利用快递

我一生都无法正确配置此东西,因此当我单击Web应用程序时,将正确地为节点应用程序提供服务。我认为我的问题出在web.config。有人可以帮助我编写正确的web.config使其正常工作吗?我的配置的当前版本将为我提供一个节点响应,该响应说它无法以我键入的任何URL获取资源。

这是我的配置的当前版本:

<configuration>
  <system.webServer>    
    <handlers>
      <add name="iisnode" path="app.js" verb="*" modules="iisnode" />
    </handlers>    
    <rewrite>
      <rules>
        <rule name="bar">
          <match url="bar/*" />
          <action type="Rewrite" url="app.js" />
        </rule>
      </rules>
    </rewrite>    
  </system.webServer>
</configuration>

问题答案:

不久前,我在虚拟目录中运行我的应用程序时遇到了同样的问题。

经过大量的时间浪费和苦苦挣扎后,我得以将所有部分组合在一起以使我的应用程序可以在虚拟目录中工作,其中包括使用Socket.io的应用程序

由于关于该特定场景和可用资源的资料很少,因此我发现,仅部分描述了如何解决此问题。这是有关如何使所有这些工作的教程。我个人有多个使用此设置实现REST
API或Socket.io的Node.js Web服务。

我强烈建议使用下面的Web.config模板来使此工作正常。

IISNode Web.config模板

https://gist.github.com/pbaio/f63918181d8d7f8ee1d2

我在上面的链接中配置了一些注释,以便于使用。它被配置为使用app.js作为主文件,但是如果您的文件命名不同,则只需将值切换为使用该文件即可。

要使此配置正常工作 ,如果您尚未安装IIS,则需要URL重写模块。

默认设置

默认情况下,此模板设置为在IIS中运行的标准Web应用程序中运行,而不在虚拟目录环境中运行。但是,通过一些小的调整,您可以使用相同的Web.config在虚拟目录中运行Node.js应用程序。

获取Express以使用您的虚拟目录

IISNode使所有键都在<appSettings>环境变量中声明。我们可以利用此优势来设置虚拟目录路径,并将其公开给我们的主文件。在上面的模板中,我们的主文件是app.js

获取我们的虚拟目录路径

我们需要在Web.config文件中获取从中路由应用程序的路径。我们通过访问过程对象上的环境变量来做到这一点。将以下行添加到我们的app.js文件中。

var virtualDirPath = process.env.virtualDirPath || '';

这将从Web.config中检索我们的virtualDirPath,并将其默认值为空字符串。

路由页面

然后,我们可以将virtualDirPath放在路由的前面,如果您使用的是Jade或EJS之类的视图引擎,我们可以将虚拟目录的超链接路径传递给该视图:

var app = require('express')();
app.get(virtualDirPath + '/', function(req, res) {
  res.render('index', { virtualDirPath: virtualDirPath });
});

静态内容

我们可以很容易地为您服务,如下所示:

app.use(express.static(path.join(virtualDirPath, 'public')));

如果您使用的是Bower.io,则同样:

app.use('/bower_components', express.static(path.join(virtualDirPath,'bower_components')));

在Express&Socket.io中使用虚拟目录

将虚拟目录与Socket.io结合使用时,我们需要对服务器和客户端的配置进行更改。

服务器端

我们需要将Socket.io服务器配置为与您通常配置稍有不同。

var app = require('express')();

var virtualDirPath = process.env.virtualDirPath || '';

var server = require('http').Server(app);
var io = require('socket.io')(server, { path: virtualDirPath + '/socket.io' });
// Get the port that we should be listening on
server.listen(process.env.PORT || 8080);

在上面的代码中,我们正在修改Socket.io服务器以在我们的virtualDirpath而不是默认路径('/socket.io'是默认路径)上运行。

Web.config更改

为了使IISNode可以正确地与socket.io配合使用,我们还需要添加一些其他的url重写并换出我们的处理程序。在上面的模板配置文件中,我们可以在第57行看到Socket.io处理程序,该处理程序在模板中已注释掉。

<add name="iisnode-socket.io" path="app.js" verb="*" modules="iisnode" />

然后,我们需要为Socket.io路径添加URL重写

<rule name="SocketIO" patternSyntax="ECMAScript">
    <match url="socket.io.+" />
    <action type="Rewrite" url="app.js"/>
</rule>

客户端

在客户端,我们只需要指定Socket.io服务器正在侦听的路径,而不是其默认路径即可。

var socket = io.connect('http://example.com:port', { path: '/virtualDirPath/socket.io' });

此时,将Socket.io应用程序运行在带有IISNode的虚拟目录中,一切都应该很好。

环境信息

使用此配置的应用程序是使用Node.js,Express 4.12.3构建的,并在安装了IISNode的IIS
7.5中运行。另外,通过更改conifg文件中的处理程序,Socket.io也可以在虚拟目录中使用。上例中使用的Socket.io版本为1.3.5



 类似资料:
  • 本文向大家介绍运行Node.js的IIS扩展iisnode安装配置笔记,包括了运行Node.js的IIS扩展iisnode安装配置笔记的使用技巧和注意事项,需要的朋友参考一下 今年年初打算用Node.js基于Express框架重写博客程序,从此告别ASP.NET。然而,我目前用的VPS是Windows Server系统、IIS服务器,如果让Express和IIS都监听80端口,明显会产生冲突。幸好

  • 问题内容: 有没有比确定正在运行的node.js进程的根目录更好的方法?类似于,但适用于Node.js。我正在寻找尽可能可预测和可靠的东西。 问题答案: 有几种方法可以解决此问题,每种方法各有利弊: require.main.filename 从http://nodejs.org/api/modules.html: 直接从Node运行文件时,将其设置为。这意味着您可以通过测试确定文件是否已经直接运

  • 本文向大家介绍iisvdir.vbs iis虚拟目录管理脚本使用介绍,包括了iisvdir.vbs iis虚拟目录管理脚本使用介绍的使用技巧和注意事项,需要的朋友参考一下 IIS管理器也是通过调用iisvdir.vbs来实现虚拟目录的创建和删除的。我们可以通过命令行的方式来执行iisvdir.vbs脚本 1)创建虚拟目录: cscript c:\windows\system32\iisvdir.v

  • 问题内容: 我有一个在AWS EC2的Linux上运行的Node.JS应用程序,该应用程序使用fs模块读取HTML模板文件。这是应用程序的当前结构: HTML模板将始终位于该位置,但是,模板读取服务可能会移动到其他位置(更深的子目录等)。在模板读取服务中,我使用fs.readFileSync()加载文件,就像这样: 这将引发以下错误: 我假设这是因为路径“ ./”解析为“ / services /

  • 无论如何处理路径,当我尝试访问{server}/{virtualdirectory}/swagger时,在应用程序中得到的是/swagger/v1/swagger.json文件中的404。UI加载,但它不会加载json文件,因为它总是试图在服务器根查找它。 有人能给我指个正确的方向吗?

  • 问题内容: 我已遵循Go网站上的“ 编写Web应用程序”教程,并且开始编写自己的Web应用程序。我还阅读了《如何编写Go代码》的开始,并尝试使用相同的工作区结构来组织我的代码。 我正在编写一个名为mygosite的简单Web应用程序,该应用程序通过呈现单个模板来处理所有请求。运行之后,我的目录结构现在看起来像这样: 在我的代码中,我指的是带有path的模板。运行时,应用程序找不到源模板,因为它位于