用request发送了大量的post请求,导致node进程感觉很不稳定?
发布于 10 年前 作者 seasidesun 18555 次浏览 最后一次编辑是 8 年前

在express框架里,使用了request发送了大量的psot请求,发现进程第二天挂掉了 代码是这样的: var request = require(‘request’); request({ url: url, //url类似http://XX.XX.XX.XX:8765 metgod: ‘post’, body: JSON.stringify(params) //post的数据 }, function(err, response, body){ return callback(err, response, body); //在回调里处理结果 });

找了下相关资料,有的说是因为没有写头部 headers: {
‘Content-Type’:‘application/x-www-form-urlencoded’, ‘Content-Length’: data.length
} 但是不写头部也能正常得到返回的结果,只是有时候会出现“socket hang up”的错误 而且也不能导致进程挂掉啊~~~ 于是自己写了个守护进程,当进程挂掉后,会自动重启,4天后发现进程是正常启动的,但是缺访问不了网站了

于是有一下几个疑问: 1、使用http.request和request有什么区别嘛,之前用过require(‘http’); 2、为什么进程会挂掉,是因为没加头部,或者是因为没有 req.end()
3、进程挂掉,是因为缓存或者log太多的原因吗?感觉很不稳定,除了守护进程外,有没有其他办法?

10 回复

估计是keep alive的问题,用完就及时释放链接。

@okoala 恩?怎么去释放链接呢?req.end( );? 有个疑问,我这样去写:

var req = request({ url: url, //url类似http://XX.XX.XX.XX:8765 metgod: ‘post’, body: JSON.stringify(params) //post的数据 }, function(err, response, body){ return callback(err, response, body); //在回调里处理结果 });

req.end();

我没有在回调里面去写req.end(); 而nodejs是异步的,这样难道不是在还没得到返回结果前,就直接结束(end())了嘛?

@okoala 你的意思是用连接池嘛?以前java用过,nodejs还没试过~~能说仔细点嘛

metgod: 'post', met god,遇见上帝?是method吧,改过来试试

如果是大量并发的话,建议用async.parallelLimit控制下同时并发数量,太大的话是承受不住的

另外如果是提交POST请求,别把值写到body里,官方文档里有例子

request.post('http://service.com/upload', {form:{key:'value'}})
// or
request.post('http://service.com/upload').form({key:'value'})

re:第一个问题 request和http.request完全是两回事,http.request是node.js里自带的函数,request是一个比较流行的第三方npm包,集成了很多方便功能,建议楼主多看文档,文档里都有楼主不明白的问题。 这个request觉得唯一一个问题就是如果是比如说上传一个大文件,或者从读取速度快的stream pipe到写入速度慢的stream,会有大量memory leak内存泄露。之前遇到过debug了好久终于找到解决方案,提了个pull request,补上后内存占用就正常了。不过这个问题和楼主遇到的无关。楼主的问题是太马虎不细心了,也没看文档

@andyhu 是我的疏忽~~~抱歉!

@andyhu 以前真的不怎么看文档,但是你这么一说,感觉自己太不专业了~~虚心学习,多看文档

回到顶部