Tag: node.js

为什么Node.js是单线程的?

在基于PHP(或Java / ASP.NET / Ruby)的Web服务器中,每个客户端请求都在新线程上实例化。 但是在Node.js中,所有的客户端运行在同一个线程上(他们甚至可以共享相同的variables!)我明白I / O操作是基于事件的,所以它们不会阻塞主线程循环。 我不明白的是为什么Node的作者select它是单线程? 这使事情变得困难。 例如,我不能运行CPU密集型函数,因为它阻塞了主线程(并且新的客户端请求被阻塞),所以我需要产生一个进程(这意味着我需要创build一个单独的JavaScript文件并在其上执行另一个节点进程)。 但是在PHP中,cpu密集型任务不会阻塞其他客户端,因为正如我所提到的,每个客户端都在不同的线程上。 与multithreadingWeb服务器相比,它有什么优势? 注意:我已经使用了群集来解决这个问题,但并不漂亮。

了解护照序列化反序列化

你如何向外行解释Passport序列化和反序列化方法的工作stream程? 在passport.serializeUser被调用后, user.id去哪里? 我们正在调用passport.deserializeUser之后它在哪里适合工作stream? // used to serialize the user for the session passport.serializeUser(function(user, done) { done(null, user.id); // where is this user.id going? Are we supposed to access this anywhere? }); // used to deserialize the user passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); 我仍然试图把我的头围绕着它。 我有一个完整的工作应用程序,并没有遇到任何forms的错误。 我只是想了解这里究竟发生了什么? 任何帮助表示赞赏。

无法在Windows 7 x64 / VS2012上安装需要编译的节点模块

我无法安装任何需要编译的模块。 所有他们失败,以下错误: MSBUILD : error MSB3411: Could not load the Visual C++ component "VCBuild.exe". … 我的环境: Windows 7企业版x64,版本6.1.7601 节点x86 0.8.16 npm 1.2.0 node-gyp 0.8.2 Visual Studio 2012和众多软件包 相关环境variables: Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShel l\v1.0;C:\Program Files\TortoiseGit\bin;C:\Program Files\Microsoft\Web Platform Installer\;C:\Program Files (x86)\Microsoft ASP.NET\ASP.NET Web Pages\v1.0\;C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;c:\tools;c:\tools\node 没有INCLUDE,LIB,LIBPATH等 我做了一个简短的调查问题,并找出以下设置手动编译(调用VCBuild.exe和msbuild.exe直接)手动克隆git://github.com/einaros/ws.git成功: SET Configuration=Release SET PATH=%ProgramFiles(x86)%\Microsoft Visual Studio […]

如何使node.js中的require始终相对于项目的根文件夹?

我想要我的文件总是由我的项目的根,而不是相对于当前模块。 例如,如果你看看https://github.com/visionmedia/express/blob/2820f2227de0229c5d7f28009aa432f9f3a7b5f9/examples/downloads/app.js第6行,你会看到 express = require('../../') 海事组织真的很糟糕。 想象一下,我想把我所有的例子只接近一层。 这是不可能的,因为在每个例子中,我将不得不更新30多个例子并多次更新。 对此: express = require('../') 我的解决scheme将有一个特殊情况下的根:如果一个string以$开头,那么它是相对于项目的根文件夹。 任何帮助表示赞赏,谢谢 更新2 现在我正在使用require.js,它允许您以一种方式写入,并在客户端和服务器上同时工作。 Require.js还允许您创build自定义path。 更新3 现在我转到了webpack + gulp,并使用enhanced-require来处理服务器端的模块。 看到这里的理由: http : //hackhat.com/p/110/module-loader-webpack-vs-requirejs-vs-browserify/

如何在node.js的express.js框架中启用跨源资源共享(CORS)

我正在尝试在node.js中构build一个支持跨域脚本的Web服务器,同时仍然从公共目录提供静态文件。 我正在使用express.js,并不确定如何允许跨域脚本( Access-Control-Allow-Origin: * )。 我看到这个post ,我没有find有用的。 var express = require('express') , app = express.createServer(); app.get('/', function (req, res, next) { res.header("Access-Control-Allow-Origin", "*"); res.header("Access-Control-Allow-Headers", "X-Requested-With"); next(); }); app.configure(function () { app.use(express.methodOverride()); app.use(express.bodyParser()); app.use(app.router); }); app.configure('development', function () { app.use(express.static(__dirname + '/public')); app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); }); app.configure('production', function () { var oneYear = […]

实时HTTPstream媒体到HTML5video客户端的最佳途径

我很困惑,试图理解使用node.js实时输出ffmpeg到HTML5客户端的最佳方式,因为在这里有很多variables,我在这个领域没有太多的经验,花了很多时间尝试不同的组合。 我的用例是: 1)IPvideo摄像机RTSP H.264stream由FFMPEG接收,并在节点中使用以下FFMPEG设置重新混合成mp4容器,输出到STDOUT。 这只在初始客户端连接上运行,所以部分内容请求不会再尝试产生FFMPEG。 liveFFMPEG = child_process.spawn("ffmpeg", [ "-i", "rtsp://admin:12345@192.168.1.234:554" , "-vcodec", "copy", "-f", "mp4", "-reset_timestamps", "1", "-movflags", "frag_keyframe+empty_moov", "-" // output to stdout ], {detached: false}); 2)我使用节点http服务器来捕获STDOUT,并在客户端请求时将数据stream发送回客户端。 当客户端第一次连接时,我产生了上面的FFMPEG命令行,然后pipe道STDOUTstream到HTTP响应。 liveFFMPEG.stdout.pipe(resp); 我也用stream事件来写FFMPEG数据到HTTP响应,但没有什么区别 xliveFFMPEG.stdout.on("data",function(data) { resp.write(data); } 我使用下面的HTTP标头(在预先录制的文件中使用和使用) var total = 999999999 // fake a large file var partialstart = 0 var partialend = total – […]

Node.js项目的文件夹结构

我注意到Node.js项目经常包含这样的文件夹: / libs,/ vendor,/ support,/ spec,/ tests 这些是什么意思? 他们之间有什么不同,我应该在哪里包含引用的代码?

所有的Node.jscallback函数都是asynchronous的吗?

我正在学习Node.js,我在每个教程中都听到的是“Node is asynchronous and no-blocking!” 我听说在常规的浏览器JavaScript只有某些东西,如AJAX调用可以做asynchronous或非阻塞(使用callback)…这是真的Node.js,或所有的Node.jscallback函数asynchronous/非阻塞?

为什么有同步和asynchronous模块的规范?

我刚读完这篇关于Javascript模块的文章 。 我可以理解,CommonJS模块是同步加载的,而AMD模块是asynchronous加载的。 我不明白的是,如果我使用CommonJS格式编写模块,那么我怎样才能使模块变得奇迹般地同步 ,或者如果我以AMD格式编写,它怎么变成奇迹般的asynchronous。 我的意思是JavaScript没有define或甚至require关键字。 他们只是规格而不是图书馆。 我的意思是模块加载的行为取决于模块加载器,而不是模块的结构。 如果是这样的话,为什么遵循不同types的模块的编码模式? 我是否认为NodeJS世界中的所有库都是同步加载的,而不pipe它们以什么格式写入。 浏览器空间中的所有模块都是asynchronous加载的。 如果我上面的假设是正确的,那为什么还有UMD的规格呢? 我的意思是如果一个脚本根据它所在的环境加载,那么为什么要为通用模块加载一个规范? 有人可以帮我解决这个问题吗?

Mongoose嵌套的对象数组中的唯一值

对于我的项目,我想为组织团体保留一份mongoose文件,就像这样: var groupSchema = Schema({ name : { type : String }, org : { type : Schema.Types.ObjectId, ref : 'Organization' }, … users : [{ uid : { type : Schema.Types.ObjectId, ref : 'User' }, … }] }); 我想阻止同一个用户在同一个组中两次。 要做到这一点,我需要强制users.uid在用户数组中是唯一的。 我试着说“唯一:真正的”为uid,但这并不奏效。 有没有办法做到这一点与mongoose或mongoDB没有额外的查询或拆分架构? 编辑:我改变了以前的uid值为uid:{type:Schema.Types.ObjectId,ref:'User',index:{unique:true,dropDups:true}}但是,这似乎并不奏效。 编辑:假设没有简单的方法来实现这一点,我添加了额外的查询检查用户是否已经在组中。 这在我看来是最简单的方法。