node.js到底是啥

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了node.js到底是啥相关的知识,希望对你有一定的参考价值。

我现在只知道他本身是用C++开发的,但是它是什么,是开发平台?是运行环境?是新的语言? 据我观察 这应该不是新的语言吧。其他的话,它是基于什么语言开发东西呢?
求简洁明了的正确答案。高分拜上!
还想了解一下node的发展前景,有了解的能帮忙说一下吗?node和php哪个更有发展前途,可能问题有点幼稚,但是真心请各位耐心指教

node.js...它既是开发平台, 也是运行环境, 也是个新的语言...它本身是基于google的javascript v8引擎开发的, 因此在编写基于它的代码的时候使用javascript语言. 但是又不同于传统概念的javascript...它的服务端功能以及部分客户端功能必须在服务端运行, 所以它实际上是一种在服务端的开发+运行的javascript语言. 有一点类似于Perl + PHP或者Python的概念. 它本身可以作为HTTP Server, 也可以当作TCP Server用. 基本上就是这样...追问

回答很到位,我喜欢,嘿嘿……能再说一下node.js的发展前景吗?兴趣在PHP,现在刚接触到这个node,值得今后改变方向吗?搞这个有多大前途?

追答

要说发展前景. 目前全世界范围内都在推行html5, 在HTML5的影响下现在javascript越来越流行. 而且google和mozilla都在不断的提高自身javascript引擎的运行效率. 再加上它自身可以作为框架进行二次编译. 前景还是乐观的, 实际上是个挺牛逼的创意. 它本身可以作为HTTP Server使用, 不像PHP必须依赖于Apache或者lighttpd+FastCGI这种模式. 它自身有一套自己的套件管理系统, 可以安装和加载第三方开发的套件. 有点类似Linux下RPM的概念或者Python加载模块的概念. 相当的好玩阿, 目前这玩意在国外火热. 而且安装简单, 上手倍儿快.

但要说为它改变方向我觉得目前还不至于, 毕竟LAMP目前依然是主流趋势. 至于未来...说不准...我目前也只是在实验它服务端这部分功能. 但如果它这东西真的又可以完全符合W3C制定的HTML5 API标准, 比如通过加载套件的方法, 而同时又可以进行服务端操作. 那真的将是非常的强悍...我建议先别考虑前途, 装个先玩着. 反正挺有意思...

补充: 可以推荐你一篇简单的教程, 从Hello World开始. 你可以先看看它的大概意思试试感觉...Learning Server-Side JavaScript with Node.js | Nettuts+ : http://net.tutsplus.com/tutorials/javascript-ajax/learning-serverside-javascript-with-node-js/

参考技术A Node.js和apache没什么联系吧,只是PHP通常需要apache作为网页服务器,而node.js本身就自带一个web服务器。
通俗的来说,Node.js就是一门”用JS语法的服务器开发语言“,所谓服务端开发语言,PHP,Java,C#都是,他们各自有各自的语法。而Javascript通常是一门运行在浏览器上的前端开发语言。
Node.js的语法上的特别之处在于,他没有自己再独创一门语言和语法,比如”Aava,Bava,Cava“之类的。他用前端语言Javascript包装了底层实现,使你能够用Javascript的语法做服务器端的开发。也就是说,你只要熟悉Javascript,你就可以像使用PHP,Java那样编写后台代码了。
至于Node.js通常适用于高并发的场景,因为它没有多线程的概念,比如你做一个写文件的操作,当一个请求执行到耗时间的写文件这一步的时候,进程会将这个操作交给后台执行,本身继续执行别的请求。这样的好处在于少了创建销毁线程的开销,使主进程永远处于满载状态。
参考技术B 回答

你好,node的中文意思是n. 茎节;结,结节;结点,节点;(尤指人体关节附近的)硬结;(计算机网络的)网点;(物理,数)波节;调和函数零点;(电流或电压)零点【名】 (Node)(法)诺德(人名)网络 节点;结点;淋巴结专业 节点 [计算机科学技术];节点 [电子、通信与自动控制技术];结点 [经济学]

参考技术C “Node 是一个服务器端 JavaScript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。”

优点:
js是跨平台的,手机、平板电脑、笔记本、个人电脑等随处可见它的身影,降低跨平台开发的难度;
Node 并不只是 Apache 的一个替代品,它旨在使 PHP Web 应用程序更容易伸缩;
Node 表现出众的典型示例包括:RESTful API、Twitter 队列、电子游戏统计数据。

综上所述,它是一种新型的应用,旨在解决某类问题,如类似ajax的出现,学会用它,可以让你的价值增倍....

参考资料:http://www.ibm.com/developerworks/cn/opensource/os-nodejs/

本回答被提问者采纳

在 Node.js 中进行同步 MongoDB 查询的正确方法是啥?

【中文标题】在 Node.js 中进行同步 MongoDB 查询的正确方法是啥?【英文标题】:What is the right way to make a synchronous MongoDB query in Node.js?在 Node.js 中进行同步 MongoDB 查询的正确方法是什么? 【发布时间】:2012-08-15 08:17:53 【问题描述】:

我正在使用 MongoDB 的 Node.JS 驱动程序,我想执行一个同步查询,如下所示:

function getAThing()

    var db = new mongo.Db("mydatabase", server, );

    db.open(function(err, db)
    
        db.authenticate("myuser", "mypassword", function(err, success)
        
            if (success)
            
                db.collection("Things", function(err, collection)
                
                    collection.findOne( name : "bob", function(err, thing)
                                               
                        return thing;
                    );
                );
            
        );
    );

问题是,db.open 是一个异步调用(它不会阻塞),所以 getAThing 返回“未定义”,我希望它返回查询结果。我确信我可以使用某种阻塞机制,但我想知道执行此类操作的正确方法。

【问题讨论】:

【参考方案1】:

ES 6(节点 8+)

您可以使用async/await

await 操作符暂停异步函数的执行,直到 Promise 被解析并返回值。

这样您的代码将以同步方式工作:

const query = MySchema.findOne( name: /tester/gi );
const userData = await query.exec();
console.log(userData)


较旧的解决方案 - 2013 年 6 月 ;)

现在Mongo Sync 可用,这是在 Node.js 中进行同步 MongoDB 查询的正确方法。

我也在用这个。您可以编写如下同步方法:

var Server = require("mongo-sync").Server;
var server = new Server('127.0.0.1');
var result = server.db("testdb").getCollection("testCollection").find().toArray();
console.log(result);

注意:它依赖于node-fiber,并且在 Windows 8 上存在一些问题。

编码愉快:)

【讨论】:

我用 mongo-sync 编写了一个 5 行脚本,但它失败了,尽管它几乎完美地匹配了他们的测试代码。它似乎有错误。 @jcollum :您能描述一下您遇到的确切问题吗?因为它对我有用,没有大问题。如果您确定它是模块中的错误,您可以在 Repo 上提出新问题 我提交了一个错误。显然,您必须从 mongo-sync 库中的 node_modules 中删除光纤模块。看起来像是包装问题。 如果它依赖于节点光纤,那么它不是同步的【参考方案2】:

没有办法在没有某种可怕的黑客攻击的情况下实现这种同步。正确的方法是让getAThing 接受一个回调函数作为参数,然后在thing 可用时调用该函数。

function getAThing(callback)

    var db = new mongo.Db("mydatabase", server, );

    db.open(function(err, db)
    
        db.authenticate("myuser", "mypassword", function(err, success)
        
            if (success)
            
                db.collection("Things", function(err, collection)
                
                    collection.findOne( name : "bob", function(err, thing)
                           
                        db.close();                    
                        callback(err, thing);
                    );
                );
            
        );
    );

Node 7.6+ 更新

async/await 现在提供了一种在使用返回承诺的异步 API 时以同步样式编码的方式(就像原生 MongoDB 驱动程序一样)。

使用这种方式,上面的方法可以写成:

async function getAThing() 
    let db = await mongodb.MongoClient.connect('mongodb://server/mydatabase');
    if (await db.authenticate("myuser", "mypassword")) 
        let thing = await db.collection("Things").findOne( name: "bob" );
        await db.close();
        return thing;
    

然后您可以从另一个async 函数调用它作为let thing = await getAThing();

然而,值得注意的是MongoClient 提供了一个连接池,所以你不应该在这个方法中打开和关闭它。相反,在您的应用启动期间调用MongoClient.connect,然后将您的方法简化为:

async function getAThing() 
    return db.collection("Things").findOne( name: "bob" );

请注意,我们不会在方法中调用await,而是直接返回由findOne 返回的promise。

【讨论】:

感谢 Johnny 提供的解决方法!我希望有一个开箱即用的简单方法...即使编写一个简单的if_exists() 函数也令人沮丧...顺便说一句,如果有人知道更简单的方法或驱动程序的更新,请在此处发布。 您可以随时使用异步库,以避免识别“厄运”github.com/caolan/async 这将使代码更具可读性和美观性。 @Logan 我不会称其为“解决方法”,这就是节点的设计方式。 返回的thing 是一个'[object Promise]'。我们如何读取 Promise 对象中的数据? (没有.then 回调) @user1063287 是的。有关更多示例,请参阅here。【参考方案3】:

虽然它不是严格同步的,但我反复采用并发现非常有用的一种模式是在异步函数上使用 co 和 promisify yield。对于 mongo,你可以重写上面的:

var query = co( function* () 

    var db = new mongo.Db("mydatabase", server, );
    db = promisify.object( db );
    db = yield db.open();

    yield db.authenticate("myuser", "mypassword");

    var collection = yield db.collection("Things");
    return yield collection.findOne(  name : "bob" );

);

query.then( result => 

 ).catch( err => 

 );

这意味着:

    您可以使用任何异步库编写类似“同步”的代码 从回调中抛出错误,这意味着您不需要成功检查 您可以将结果作为承诺传递给任何其他代码

【讨论】:

以上是关于node.js到底是啥的主要内容,如果未能解决你的问题,请参考以下文章

node.js是啥

node.js 的最佳 Facebook 连接库是啥?

Node.js 上 MongoDB 连接的最佳实践是啥?

Node.js 中的声明 var 是啥?

从 Node.js 中的模块导出函数的语法是啥?

node.js 中的 Haste 模块映射是啥?