我使用Windows Azure网站来托管node.js应用程序.到目前为止,一切都很好,除了我的自定义错误.在我的节点应用程序中,我有一个错误处理程序,可以在我的本地计算机上呈现自定义404和自定义500错误页面.但是,当我发布到azure时,当我将statusCode设置为除200以外的任何值时,它会覆盖响应.
如果我没有将500或404 statusCode传递给响应,那么这不会发生,但我确实希望状态代码能够进入浏览器.在本地我得到我的自定义错误页面就好了:

但是,在azure网站上,它只返回一行文字:
由于发生内部服务器错误,无法显示页面.
我尝试创建自己的web.config以覆盖默认的自定义错误,但似乎没有任何效果.这是我的web.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<customErrors mode="off" />
</system.web>
<system.webServer>
<handlers>
<add name="iisnode" path="app.js" verb="*" modules="iisnode"/>
</handlers>
<rewrite>
<rules>
<rule name="StaticContent">
<action type="Rewrite" url="public{REQUEST_URI}"/>
</rule>
<rule name="DynamicContent">
<conditions>
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="True"/>
</conditions>
<action type="Rewrite" url="app.js"/>
</rule>
</rules>
</rewrite>
<iisnode
debuggingEnabled="true"
devErrorsEnabled="true"
debuggerPathSegment="debug"
nodeProcessCommandLine=""%programfiles(x86)%\nodejs\node.exe""
logDirectory="..\..\LogFiles\nodejs"
watchedFiles="*.js;iisnode.yml;node_modules\*;views\*.jade;views\*.ejb;routes\*.js" />
</system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)
我不确定iisnode(将请求路由到node.js的iis的扩展名)负责覆盖我的错误页面或者iis本身是否负责.有什么建议?
信息:我对node.JS很新!
我编写了一个可以侦听端口XXXX上的http请求的示例服务器.当我从命令行(Windows)运行此服务器时,它似乎运行良好.它响应在浏览器中打开时对localhost:XXXX的请求.
问题:这是应该如何工作的吗?要使节点服务器运行,是否应始终打开CMD提示以使服务器侦听请求?我不能用IISNode"做点什么"吗?
我理解,如果我向一个JS文件发出请求,这个文件在IISNode中被标注为Node.JS文件并且NODE应该处理它; 然后我会让Node处理我的请求.但是,这假设IIS是我的Web服务器,并且Node可以处理特定请求.
我希望我在这里有意义!:)
我在IIS中有以下设置:
我不能为我的生活得到这个东西正确配置所以当我点击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>
Run Code Online (Sandbox Code Playgroud) 尝试为node.js创建Hello World本机模块
在VS 2012中获得了一个带有一个文件的Win32项目:
#include <node.h>
#include <v8.h>
using namespace v8;
Handle<Value> Method(const Arguments& args) {
HandleScope scope;
return scope.Close(String::New("world"));
}
void init(Handle<Object> target) {
target->Set(String::NewSymbol("hello"),
FunctionTemplate::New(Method)->GetFunction());
}
NODE_MODULE(hello, init)
Run Code Online (Sandbox Code Playgroud)
那个编译成hello.node.
选项:
- 动态库(.dll)
- 无公共语言运行时支持
使用它像:
hello = require './hello'
console.log hello.hello()
Run Code Online (Sandbox Code Playgroud)
它适用于本地机器(win8 x64,节点:0.8.12)
但是在远程服务器(Windows Server 2008 x64,节点:0.8.12,iisnode:0.1.21 x64,iis7)上它会抛出此错误:
应用程序抛出未捕获的异常并终止:错误:
%1不是有效的Win32应用程序.位于Function.Module的Module.load(module.js:356:32)的
Object.Module._extensions..node(module.js:485:11)的C:\ inetpub\test\lib\server\hello.node . _load(module.js:312:12) 在Module.require(module.js:362:17) at的require(module.js:378:17) 处.(C:\ inetpub\test\lib\server\index.js:32:9) 在Module._compile(module.js:449:26) 处于Object.Module._extensions..js(module.js:467:10) ) 在Function.Module._load的Module.load(module.js:356:32) 处(module.js:312:12)
我尝试过:
使用应用程序池设置(启用win32应用程序)没有帮助.
Iisnode x86不安装在x64操作系统上.
由于错误,无法编译为x64:错误2错误LNK1112:模块机器类型'X86'与目标机器类型'x64'冲突C:\ derby\hello\build \node.lib(node.exe)hello
有没有人有什么建议?
对于通知项目,想要推送事件通知.这些是登录,更改个人资料等内容,并显示给相应的客户端.我想讨论将它们放在一起的一些想法,并就最佳方法提出一些建议.
我在这里注意到,可以使用_changes流检测对CouchDB所做的更改,由Node拾取,然后一个进程启动.我想实现这样的东西(我使用的是SQL Server,但这个级别的入口点可能不是最好的解决方案).
而不是遵循CouchDB示例(检测基于数据库的事件,我认为这只会使事情变得复杂,因为我们对客户端事件感兴趣),我当时认为当事件发生时,例如用户登录,然后发送消息带有一些事件详细信息的节点服务器(RESTful请求?).然后处理该消息并将其广播到所有连接的客户端; 相应的客户端显示通知.
拟议的生态系统:
这将建立在使用.Net框架(IIS等)的现有项目之上.许多客户端的浏览器不支持Web套接字,因此使用Socket.IO是一个不错的选择(后备支持).但是,从我所看到的,Socket.IO仍然只支持通过IISNode进行长轮询(这不是一个真正的问题).
一个选项是将Socket.IO/Node端点暴露给所有客户端,以便基于客户端的通知可以通过JS发送到节点服务器,节点服务器广播消息.(遵循基本的聊天服务器/客户端/服务器示例).
或者,可以使用IIS端点,但只能支持长轮询(通过Socket.IO).这将提供一些额外的.Net后端处理,但可能使架构过于复杂.
Node是否有基于SQL Server的事件通知?
什么是最好的方法?
如果我没有正确的术语生态系统配置,请澄清.
谢谢.
如果我将设置添加到我的应用程序的web.config文件中,是否有API可以从我的应用程序中读取设置,或者我是否必须使用XML库读取该文件?
1)我们有一个NodeJS应用程序,我们需要在IIS 7.5/Win2k8 R2下托管.
2)我们有其他已经使用ASP.NET FormsAuthentication的应用程序.3)将使用NodeJS应用程序的用户与现有应用程序的用户是相同的用户.
因此我们将FormsAuthentication配置设置放在web.config中,并且IIS正在读取它:
[IIS>站点> {iisnode-site}>身份验证] - 无法发布图像!
但是,它完全忽略了配置 - 所以我想也许在FormsAuthentication模块之前调用iisnode模块,但是当我查看模块列表(有序视图)时,它会在此站点的底部列出iisnode,而上面列出了FormsAuthentication模块iisnode.
这甚至可能吗?我在另一篇文章@Incept上看到了带有HttpModule的iisnode请求可能是解决方法,但这种方法意味着我们需要滚动一个XHR头代理(各种) - 我们可以这样做,但作为最后的手段.
asp.net forms-authentication restful-authentication formsauthentication iisnode
我正在开发一个平均堆栈的应用程序.唯一的区别是我想在IIS而不是express.js中托管我的应用程序.这样做是否可行或可行?有哪些可能的优点和缺点?提前致谢.
我尝试在我的计算机上安装Etherpad Lite站点并运行IIS,然后再将其上载到Azure for Web Sites,但是当我尝试(http://pastebin.com/4rZWbqix)时出现此错误:
处理请求时,iisnode遇到错误.HRESULT:0x2 HTTP状态:500 HTTP原因:内部服务器错误
您收到此HTTP 200响应,因为system.webServer/iisnode/@devErrorsEnabled配置设置为"true".
除了node.exe进程的stdout和stderr的日志之外,请考虑使用调试和ETW跟踪来进一步诊断问题.
node.exe进程生成到stdout和stderr的最后64k输出如下所示:fs.js:520返回
Run Code Online (Sandbox Code Playgroud)binding.lstat(pathModule._makeLong(path)); ^ Error: EPERM, operation not permitted 'C:\Users\Matthew' at Object.fs.lstatSync (fs.js:520:18) at Object.realpathSync (fs.js:1047:21) at tryFile (module.js:142:15) at Function.Module._findPath (module.js:181:18) at Function.Module._resolveFilename (module.js:336:25) at Function.Module._load (module.js:280:25) at Module.runMain (module.js:492:10) at process.startup.processNextTick.process._tickCallback (node.js:244:9)
在Etherpad的目录中没有fs.js文件,所以我认为它是Node.js的一部分有问题.我是Node.js的新手,所以任何帮助都会受到赞赏.
编辑1:我目前正在寻找Azure的替代品,并授予C:\ Users\Matthew权限.但是有可能以某种方式修改fs.js以在try.lstat周围放置一个try/catch吗?
编辑2:稍微玩了一下(添加权限工作!),我已经得到它的工作.但现在加载127.0.0.1:81返回:
处理请求时,iisnode遇到错误.HRESULT:0x2 HTTP状态:500 HTTP原因:内部服务器错误
您收到此HTTP 200响应,因为system.webServer/iisnode/@devErrorsEnabled配置设置为"true".
除了node.exe进程的stdout和stderr的日志之外,请考虑使用调试和ETW跟踪来进一步诊断问题.
node.exe进程生成到stdout和stderr的最后64k输出如下所示:
[x1B] [33m [2012-10-03 20:28:13.587] [WARN] console - [x1B] [找到39mNo设置文件.继续使用默认值!
[x1B] [32m [2012-10-03 20:28:14.338] [INFO] console - [x1B] [39mInstalled plugins:
看起来这不是一个错误,因为输出的是预期的,但似乎停在plugins.formatPlugins().
我通过使用iisnode将节点与IIS结合使用.
在我看来,我以前在Node中配置服务器的事情现在可以直接在IIS中完成.
像:
这是否意味着我可以摆脱那样做的节点代码并且只针对IIS方法?
var fs = require('fs');
var https = require('https');
var options = {
key: fs.readFileSync('./ssl/xxxxxxx.private.pem'),
cert: fs.readFileSync('./ssl/xxxxxxx.public.pem'),
};
https.createServer(options, app).listen(443);
Run Code Online (Sandbox Code Playgroud) iisnode ×10
node.js ×8
iis ×3
azure ×2
express ×2
asp.net ×1
asp.net-4.0 ×1
etherpad ×1
iis-8.5 ×1
mean-stack ×1
native ×1
socket.io ×1
web-config ×1