nodejs项目小总结(转)

1.url的处理

querystring.parse(urlObj.query)可以把url内的query参数转为字符串

JSON.parse可以把字符串转为json

2.异步与同步

我的项目大约是这样的

接受url请求并处理-解析-去拿到环境变量与参数。

等待上面的请求ok后,并发请求,使用上面的环境变量与参数去调用php与webredis

同步异步交织在一起,很蛋疼。

不过接下来使用了eventproxy进行处理,非常好用~

https://github.com/JacksonTian/eventproxy

一个非常典型的代码

 1 ep.all(‘tpl‘, ‘data‘, function (tpl, data) {
 2   // 在所有指定的事件触发后,将会被调用执行
 3   // 参数对应各自的事件名
 4 });
 5 fs.readFile(‘template.tpl‘, ‘utf-8‘, function (err, content) {
 6   ep.emit(‘tpl‘, content);
 7 });
 8 db.get(‘some sql‘, function (err, result) {
 9   ep.emit(‘data‘, result);
10 });

那么注意下面两个函数,一定要保证callback执行,emit才会触发。

当all内事件都触发后,返回值作为参数,触发ep.all内的callback

更多的使用方法可以参考api。

3.nodejs发送post

 1  var http = require(‘http‘);
 2     var querystring = require(‘querystring‘);
 3
 4     var post_data = querystring.stringify({
 5         sys_text : ‘构造字符串”欢迎回来,道客‘+cellphone.slice(cellphone.length-4,cellphone.length)+‘,您的语镜已经连接系统,请安全驾驶‘,
 6         interval : ‘1440‘,
 7         agent: ‘超级管理员‘,
 8         userid :userid,
 9     });
10
11     var options = {
12         host:‘192.168.1.3‘,
13         port:8080,
14         path:‘/idts-1.0/httpservice/addweibo/php/add_sys_weibo.php‘,
15         method:‘post‘,
16         headers: {
17             ‘Content-Type‘: ‘application/x-www-form-urlencoded‘,
18             ‘Content-Length‘: post_data.length
19         }
20     };
21
22     var req = http.request(options, function (res) {
23         console.log("Got response: " + res.statusCode);
24         res.setEncoding(‘utf8‘);
25         res.on(‘error‘,function (e) {
26             console.log("Got error: " + e.message);
27         }).on(‘data‘, function (chunk) {
28                 console.log(‘BODY: ‘ + chunk);
29             });
30     });
31     req.write(post_data + "\n");
32     req.end();
33 }

上面是整个发送post的流程。那么注意一点一定要指定content-length头。否则会报错。ngix会报类似411 length required 这样的错误。

之后只需要利用req.write向接收端写消息体即可。

至于nodejs发送get,可以直接使用http.get方法

相关的api    http://docs.cnodejs.net/cman/http.html

3月13日更新

经过大牛snoopy的对代码的斧正,发现了几个问题

1.异常处理,JSON.parse可能会抛异常,因此需要处理

1 try {
2     var cellphone = JSON.parse(result).MGET[0]
3 } catch (e) {
4     //  console.log(e.name);     // "MyError"
5     //   console.log(e.message);     // "MyError"
6     console.log(‘数据格式不正确‘)
7 }

2. 拼接chunk

在接收服务端的数据时,若数据较长,直接在data监听可能会收到多次chunk。

利用字符串拼接chunk时,因为编码等问题,可能出现错误,因此建议用数组拼接

见这篇文章  http://cnodejs.org/topic/4faf65852e8fb5bc65113403

 1 var chunks = [];
 2 var size = 0;
 3 res.on(‘data‘, function (chunk) {
 4   chunks.push(chunk);
 5   size += chunk.length;
 6 });
 7 res.on(‘end‘, function () {
 8   var data = null;
 9   switch(chunks.length) {
10     case 0: data = new Buffer(0);
11       break;
12     case 1: data = chunks[0];
13       break;
14     default:
15       data = new Buffer(size);
16       for (var i = 0, pos = 0, l = chunks.length; i < l; i++) {
17         var chunk = chunks[i];
18         chunk.copy(data, pos);
19         pos += chunk.length;
20       }
21       break;
22   }
23 });

思路就是上面的代码,我也使用了文中提到的bufferHelper。

另外snoopy说可以使用0.10的stream2,等下次尝试。

3.多核

nodejs里内置了cluster模块,可以大大提高机器资源的使用

利用cluster做的多核

 1     function start(handle) {
 2         var http = require("http");
 3         var cluster = require(‘cluster‘);
 4         var http = require(‘http‘);
 5         var numCPUs = require(‘os‘).cpus().length;
 6         if (cluster.isMaster) {
 7             for (var i = 0; i < numCPUs; i++) {
 8                 cluster.fork();
 9             }
10             cluster.on(‘death‘, function (worker) {
11                 console.log(‘worker ‘ + worker.pid + ‘ died‘);
12                 cluster.fork();
13             });
14         } else {
15             function onRequest(request, response) {
16                 var options = {
17                     host:‘192.168.1.6‘,
18                     port:7379,
19                     path:‘/SADD/‘ + ‘niaAOVU2lg‘ + ‘:config/‘ + ‘2013-03-09‘ + Math.random(),
20                     method:‘get‘
21                 };
22                 var req = http.get(options, function (res) {
23                     //    console.log("Got response: " + res.statusCode);
24                     res.on(‘error‘,function (e) {
25                         //     console.log("Got error: " + e.message);
26                     }).on(‘data‘, function (chunk) {
27                             //         console.log(‘BODY: ‘ + chunk);
28                         });
29                 });
30                 req.on(‘error‘, function (e) {
31                     //  console.log("Got error: " + e.message)
32                 })
33                 req.end()
34                 response.writeHead(200, {‘Content-Type‘:‘text/html‘});
35                 response.end()
36             }
37
38             var server = http.createServer(onRequest).listen(8888);
39         }
40     }
41
42     exports.start = start;//定义模块给外面的函数

经过性能测试,8核的机器跑满了能达到以前的八倍。。。(8个同时跑嘛。。)

还有个问题

 1  var req = http.request(o, function (res) {
 2         var rec_leng = 0;
 3         var rec_ary = [];
 4        // res.setEncoding(‘utf8‘);
 5         res.on(‘error‘,function (e) {
 6            console.log("Got res error: " + e.message);
 7         }).on(‘data‘, function (chunk) {
 8                 rec_leng += chunk.length;
 9                 rec_ary.push(chunk);
10                 /*
11                 * if(rec_leng > postLimit){
12                  rec_ary = null;
13                  req.connection.destroy()
14                  }
15                 * */
16             }).on(‘end‘, function () {
17                 var buf =  Buffer.concat(rec_ary, rec_leng);
18                 var result = buf.toString();
19                 callback.call(this, result);
20             });
21     })

注意setEncoding转换的时候,会把2进制转成string buffer的concat会出错,所以两个不要一起用。

来自:http://99jty.com/?p=1157

时间: 2024-11-05 12:27:43

nodejs项目小总结(转)的相关文章

全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口

通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看出目前一本图书信息主要有: 图片字段 名称字段 作者字段 出版社字段 除了以上前端页面中可见的信息外,在服务器开发中还需要给每一条记录(数据)都加上下面的几个字段: 创建时间字段 更新时间字段 删除时间字段 最后完成的数据库表如下: ps:由于数据库是直接导入的,之前的数据库是没有时间字段的,所以前

全栈项目|小书架|服务器端-NodeJS+Koa2 实现书籍详情接口

通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 书籍详情分析 书籍详情页面如下: 从上图可以分析出详情页面大概有以下几个接口: 获取书籍详情信息 获取用户对书籍的喜欢状态接口 喜欢/不喜欢书籍接口 获取评论列表 写评论接口 以上的接口,有的数据可以直接从已存在的数据表中去获取,比如:书籍详情信息,而其他新接口就需要创建对应的model,然后根据model创建相应的数据表. 比如 用户对书籍的喜欢操作,可以创建li

webstorm/...开发 NodeJS 项目

前提: 已安装好 webstorm/IDEA 2016.3 & 2017.1 (见 文 IDEA开发Java 相关 --- 1 IDEA安装 ...) 要用 IDEA 开发 NodeJS项目(web/JS)项目,首先需要: 1. 自行下载 Node.js 并安装,下载网址:https://nodejs.org/en/download/:或者 https://nodejs.org/en/: 测试: cmd-> node -v  或者 node, 未出现错误,如下,则表明已安装完好.   其次,

【Nodejs项目手记】Nodejs中使用图片验证码,captchapng模块可以解决Nodejs图片验证码

Nodejs项目,在做图片验证码的时候遇到了难题.Nodejs没有图片库,以后会有,但是现在没有. 网络上搜索一圈,有几个解决方案: 1.采用第三方验证码程序,有的时候,项目可能不允许: 2.使用Java或者PHP生成图片,Nodejs调用,中间采用Redies共享: 这两种方式都不太理想,好在终于找到了可以支持Nodejs图片验证码的一个库,虽然只支持数字,但是也还不错.原理是使用Base64的图片编码方式. 这个库的Gighub地址是:https://github.com/GeorgeCha

学习笔记-使用cmd命令行创建nodejs项目

使用cmd命令行创建nodejs项目 1)在DOS下cd 进入到你想要创建项目的路径. 2)mkdir sing (创建一个sing文件夹) 3)cd sing 4) npm init (初始化工程) 此时需要填写一些项目信息,你可以根据情况填写,当然也可以一路回车. 5)安装第三方包(后面程序会直接调用包的模块) 说明:由于http模块.fs模块都是内置的包,因此不需要额外添加. 这里安装cheerio包,和request包. 在dos中,cd进入sing文件夹,然后npm install c

如何编写package.json配置NodeJS项目的模块声明

在NodeJS项目中,用package.json文件来声明项目中使用的模块,这样在新的环境部署时,只要在package.json文件所在的目录执行 npm install 命令即可安装所需要的模块. package.json文件中可配置的项有:名称(name).应用描述(description).版本号(version).应用的配置项(config).作者(author).资源仓库地址(repository).授权方式(licenses).目录(directories).应用入口文件(main)

一些好用的项目小工具

sublime text 2代码编辑器 xmind思维导图 sourceinsight代码阅读器 一些好用的项目小工具,布布扣,bubuko.com

一个简单的nodejs项目(cat-names)分析

https://github.com/sindresorhus/cat-names 一个非常简单的nodejs项目,用来方便的获取猫猫的名字: 安装: npm install --save cat-names 用法: const catNames = require('cat-names'); //获取随机猫名 catNames.random(); // => 'Max' index.js源码 非常简单,不解释 'use strict'; var uniqueRandomArray = requ

如何在NodeJS项目中优雅的使用ES6

如何在NodeJS项目中优雅的使用ES6 NodeJs最近的版本都开始支持ES6(ES2015)的新特性了,设置已经支持了async/await这样的更高级的特性.只是在使用的时候需要在node后面加上参数:--harmony.但是,即使如此node也还是没有支持全部的ES6特性.所以这个时候就需要用到Babel了. 现在开始Babel 在开始使用Babel之前,假设 1. 你已经安装了nodejs,并且已经熟悉了Js. 2. 你也可以使用npm安装各种依赖包. 3. 而且你也对ES6(后来改为