1. 首页 > 电脑手机 >

nodejs文档 nodejs文档哪个网站比较好

Node.js中关于多进程模块Cluster的详细介绍以及如何使用

众所周知Node.js是单线程的,一个单独的Node.js进程无法充分利用多核。Node.js从v0.6.0开始,新增cluster模块,让Node.js开发Web服务时,很方便的做到充分利用多核机器。这篇文章主要给大家介绍了关于Node.js中多进程模块Cluster的相关资料,需要的朋友可以参考下

nodejs文档 nodejs文档哪个网站比较好nodejs文档 nodejs文档哪个网站比较好


前言

我们都知道nodejs的特点就是单进程、无阻塞运行,并且是异步事件驱动的。Nodejs的这些特性能够很好的解决一些问题,例如在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。既然Node.js采用单进程、单线程模式,那么在如今多核硬件流行的环境中,单核性能出色的Nodejs如何利用多核CPU呢?创始人Ryan Dahl建议,运行多个Nodejs进程,利用某些通信机制来协调各项任务。目前,已经有不少第三方的Node.js多进程支持模块发布,而NodeJS 0.6.x 以上的版本提供了一个cluster模块 ,允许创建“共享同一个socket”的一组进程,用来分担负载压力。

本篇文章就基于该cluster模块来讲述Node.js在多核CPU下的编程。

Cluster模块介绍

nodejs所提供的cluster模块目前尚处于试验阶段,在v0.10.7的文档上我们可以看到模块的发布信息如下: Stability: 1 - Experimental关于该模块的功能,源文档描述如此“A single instance of Node runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.” 其意就是:Node的示例以单进程的模式运行,有时为了充分利用多核系统的资源用户需要运行一组Node进程来分担负载。

Cluster用法介绍

首先贴出一段该模块示例应用代码,接下来进行详细分析,代码如下: 这段代码很简单,主线程就是当前运行的js文件,主线程根据你本机系统的核数来创建子进程。所有进程共享一个监听端口8000,当有请求发起时,主线程会将该请求随机分配给某个子进程。console.log('Worker #' + cluster.worker.id + ' make a response');这句代码可以打印出是哪个进程处理该请求。

问题分析

我们前面提到有请求发起时,由系统来决定将该请求交给哪个进程进行处理。这种完全依赖于系统的负载均衡存在着一个重要缺陷:在windows,linux和Solaris上,只要某个子进程的accept queue为空(通常为创建的那个子进程),系统就会将多个connetion分配到同一个子进程上,这会造成进程间负载极为不均衡。特别是在使用长连接的时候,单位时间内的new coming connection并不高,子进程的accept queue往往均为空,就会导致connection会不停的分配给同一个进程。所以这种负载均衡完全依赖于accept queue的空闲程度,只有在使用短连接,而且并发非常高的情况下,才能达到负载均衡,但是这个时候系统的load会非常高,系统也会变得不稳定起来。

总结

如何解决nodejs的路径问题

express.static

问题出在哪儿?

nodejs后端的用了express,index.html是一个静态文件。我们知道,通过 Express 内置的 express.static 可以方便地托管静态文件,例如图片、CSS、JaScript 文件等。

将静态资源文件所在的目录作为参数传递给 express.static 中间件就可以提供静态资源文件的访问了。例如,假设在 public 目录放置了图片、CSS 和 JaScript 文件,可以使用如下代码:

app.use(express.static('public'));所以,找到项目中的代码,查看static调用的地方,和上面一行代码很一样:

app.use(express.static('public'));到此,我已经发现了问题,我告诉小伙伴,这个地方不用相对路径可以解决这个问题。由于打包时间限制,我让小伙伴先简单处理下,打完包之后,在来整理下思路:

app.use(express.static('resource/public'));当然重要的是,这个问题其实不难,自己多钻研下,很容易发现问题,也就不会出这个问题,所以小伙伴自己打手心吧。

恩,你没看错,这个地方还是相对目录。后续产品中会改成比较好的一种情况。

express.static方法解析

事实上,express.static方法如果传入的是相对路径,express会自己把他转换为路径,我们可以查看下源代码,在express.js找到如下代码:

exports.static = require('serve-static');说明static 调用了serve-static这个包,直接找到这个包,查看index.js, 可以看到代码,下面列出重要的两行

...

var resolve = require('path').resolve

...

opts.root = resolve(root)

...这两行就是,express把相对目录转换成目录的代码,可以看出,终使用的path这个内置对象的resolve方法,继续往下看。

path对象的resolve方法

直接查看这个方法的api文档,如下:

下面是这个方法的解释:

The path.resolve() method resolves a sequence of paths or path segments into an absolute path.

啥意思呢? 就是这个方法把一系列的paths或者path segments 组织成一个路径,比如

path.resolve('/foo','bar');

// return /foo/bar详细的说明请自行参考文档,这个地方有一句话需要特别注意:

If after processing all given path segments an absolute path has not yet been generated, the current working directory is used.

啥意思,就是如果处理完了所有的path segments,也没有生成一个路径, 就要使用 当前工作目录(current working directory)。比如:

path.resolve('bar');

// 加上 /Users/terry 是当前工作目录, return /Users/terry/barapi文档中一个比较复杂的示例(此处注意resolve的时候,从右到左,参考文档了解详情):

path.resolve('wwwroot', 'static_files/png/', '../gif/image.gif');

// if the current working directory is /home/myself/node,

// this returns '/home/myself/node/wwwroot/static_files/gif/image.gif'现在的问题是,啥是当前工作目录。

nodejs 当前工作目录 current working directory

nodejs 当前工作目录是启动Node的目录。也就是说,从哪个目录进去启动node,就返回哪个目录。

注意,这个目录不是指js文件所在的目录

通过process.cwd()方法可以获取当前工作目录。

下面通过一个示例来介绍这个当前工作目录,假如在/Users/terry/Documents/JSWorkspace目录下写一个js文件,test.js,代码只有一行:

console.log(process.cwd());此时如果,在目录/Users/terry/Documents/JSWorkspace下面执行命令 :node test.js 输出如下:

/Users/terry/Documents/JSWorkspace但是如果在在目录/Users/terry/Documents/下面执行命令:node ./JSWorkspace/test.js,输出的结果是:

/Users/terry/Documents因此可以看出你在那个目录执行node命令,当前目录就是那个目录。

回到之前的打包的问题,由于在开发阶段,一般都是直接在js文件所在目录执行node命令,所以相对目录写的是相对于当前js文件的目录没有问题。

可是打包之后,node的执行放到了js目录的上一层去了。此时相对目录“public”不在是相对于js文件的相对目录,而是相对于上一层的,自然就找不到这个文件夹了,从而也找不到该文件夹下的index.html文件。

如何解决

解决的方法:

1.在前面已经说过了,改这个相对目录。但这种方法很蹩脚。因为,启动node命令的目录可能会变;而是如果这应该,开发阶段的node命令执行也需要跟着改。 总之不是兼容性很好的方法。

2.直接使用路径。 但是这个路径在不同的机器上又不一样,该如何解决呢?可以考虑使用全局变量__dirname.

全局变量__dirname

查看api文档

看到解释如下:

The directory name of the current module. This is the same as the path.dirname() of the __filename。

啥意思呢,及时返回nodejs 的js文件的所在目录。

有了这个变量之后,我们就可以用如下代码解决这个问题。

app.use(express.static(__dirname + '/public'));

如何使用Nodejs连接mongodb数据库教程详解

这篇文章主要介绍了使用Nodejs连接mongodb数据库的实现代码,需要的朋友可以参考下

一个简单的nodejs连接mongodb示例,来自 mongodb示例

1. 创建package.json

首先,创建我们的工程目录connect-mongodb,并作为我们的当前目录 输入npm init命令创建package.json

然后,安装mongodb的nodejs版本driver mongodb驱动包将会安装到当前目录下的node_modules中

2. 启动MongoDB服务器

安装MongoDB并启动MongoDB数据库服务,可参考我之前的文章,或者MongoDB文档

3. 连接MongoDB

创建一个app.js文件,并添加以下代码来连接服务器地址为192.168.0.243,mongodb端口为27017上名称为myNewDatabase的数据库 在命令行输入以下命令运行app.js

4. 插入文档

在app.js中添加以下代码,使用insertMany方法添加3个文档到documents中 insert命令返回一个包含以下属性的对象:

result MongoDB返回的文档结果

ops 添加了_id字段的文档

connection 执行插入作所使用的connection

在app.js更新以下代码调用insertDocuments方法 在命令行中使用node app.js运行

5. 查询所有文档

添加findDocuments函数 findDocuments函数查询了所有'documents'中所有的文档,将此函数添加到MongoClient.connect的回调函数中

6. 使用过滤条件(query filter)查询文档

查询'a':3的文档 7. 更新文档

updateDocument方法更新满足条件a为2的个文档,新增一个b属性,并将其设置为1。

将updateDocument方法添加到MongoClient.connect方法的回调中 8. 删除文档

添加到app.js中 9. 创建索引

索引能够改善应用的性能。下面你代码在'a'属性上添加索引 更新app.js

nodejs中如何使用websocket(附代码)

这次给大家带来nodejs中如何使用websocket(附代码),nodejs中使用websocket(附代码)的注意事项有哪些,下面就是实战案例,一起来看一下。

服务端(nodejs):

var WebSocketServer = require('ws').Server,

wss = new WebSocketServer({ port: 8080 });

wss.on('connection', function (ws) {

console.log('client connected');

ws.on('message', function (message) {

console.log(message);

});

});客户端:

相信看了本文案例你已经掌握了方法,更多精彩请关注Gxl网其它相关文章!

阅读:

assets与static使用案例剖析

如何查询文档创建日期、修改日期与储存大小

Nodejs如何文件_node.js

前端童鞋都知道,jascript是没有权限作磁盘文件的,server童鞋一向都很鄙视。但是nodejs可谓让咱们前端扬眉吐气啊,近在学node,其强大的功能让人异常激动和兴奋。今天就学习了它怎么读写文件。

首先需要引入fs模块,这是nodejs自带的。

var fs=require("fs");

具体可参考Nodejs API:

主要用到了两个方法:

1、fs.readFile(filename, [encoding], [callback])

这是异步读取文件,filename是文件路径,encoding是编码格式,callback是回调函数。

异步读取一个文件的所有内容,例子如下:

这里我使用的是本地测试文件: 2、fs.writeFile(filename, data, encoding='utf8', [callback])

写文件: 错误代码:copyFile.js文件

在终端运行node copyFile.js结果如下: 注意事项:

1、文件编码,开始的时候我直接在本地新建一个txt文档,读取的时候发现结果始终是aaaaaaa这样的,结果发现用编辑打开是时候里面是乱码,其次,带上encoding,否则它会按照buffer读取。

2、同步执行问题。

上面的代码是有问题的,我把读取文件和写入文件方法分开写的,本来是想把test.txt文件中的内容到test2.txt,但是读取文件是异步执行的,也就是说谁也不知道它何年马月执行完毕,所以test.txt得到的结果是undefined。

正确的方法应该是读取完毕后执行写入文件:

如何使用nodejs分离html文件里的js和css(代码示例)

本篇文章给大家带来的内容是关于如何使用nodejs分离html文件里的js和css(代码示例) ,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

摘要: 本文要实现的内容,使用nodejs 对文件的增删改查,演示的例子-》分离出一个html 文件里面的script 和style 里面的内容,然后单独生成js文件和css 文件。中间处理异步的api-》async/await , Promise

项目托管:extract-js-css , 欢迎star

直接上代码:

// extract-js-css

// import fs from 'fs'

var fs = require('fs')

// import csscomb from 'csscomb'

// var csscomb = require('csscomb')

// var comb = new csscomb('zen');

// console.log(comb)

// 删除文件

const deleteFile = (path)=>{

return new Promise(resolve => {

fs.unlink(path, (err) => {

if (err) {

console.log(err)

return

};

console.log(`已成功删除 ${path}文件`);

resolve()

});

})

}// 删除文件夹

const deleteDir = async (path)=>{

let _files = await new Promise (resolve => {

fs.readdir(path, (err,files) => {

if (err) {

console.log(err)

};

console.log(`已成功读取 ${path} 文件夹`);

resolve(files)

})

})

if(_files && _files.length) {

for(let i =0;i<_files.length;i++) {

// console.log(_files[i],'innnnnn')

await deleteFile('./test/'+ _files[i])

}}

// console.log('delete hou')

await new Promise(resolve => {

fs.rmdir(path, (err) => {

if (err) {

console.log(err)

};

console.log(`已成功删除空 ${path}文件夹`);

resolve()

})

});

}const emptyDir = (path) => {

return new Promise(resolve => {

fs.rmdir(path, (err) => {

if (err) {

console.log(err)

};

console.log(`已成功删除空 ${path}文件夹`);

resolve()

})

})

}// 新建文件夹

/

/

const mkdirTest = ()=>{

return new Promise(resolve => {

fs.mkdir('./test', { recursive: true }, (err, data)=>{

if (err) {

console.log(err)

};

console.log('新建文件夹成功')

resolve()

})

})

}// 读取html 内容

/

/

const readHtml = ()=>{

return new Promise(resolve => {

fs.readFile('./test.html', 'utf-8', (err, data)=>{

if(err) {

throw Error(err)

}console.log('test.html 读取成功!--NO1')

resolve(data)

})

})

}// 写入css 和js

/

向文件中追加内容

@param {是文件名字} path

@param {写入文件的内容} data

@param {文件类型} type

@author erlinger

@time

/

const appendFile = (path, data, type) => {

return new Promise(resolve => {

fs.appendFile(path, data, (err) => {

if (err) {

console.log(err)

};

console.log(`${type}数据已追加到文件`);

resolve()

});

})

}// 写一个html

const writeHtml = (path, data) => {

return new Promise(resolve => {

fs.writeFile(path, data, (err) =>{

if(err) {

console.log('err', err)

return

}console.log(`${path} 写入成功,功能结束!`);

resolve() // 必须resolve 。不然 promise 就到此为止,调用该方法后面的代码将不执行

})

})

}// 插件 方法入口

(async ()=>{

console.log('==========================game-start=============================');

await deleteDir('./test');

console.log('我应该是等---删除文件夹后---才出现')

await mkdirTest();

console.log('我应该是在---文件夹新建成功---后出现!');

let cssReg = /