express框架下coffee程序:
http = require 'http'
EventEmitter = require('events').EventEmitter
exports.importRequestNumber = (db, datetime)->
COL = db.collection 'requestData'
em = new EventEmitter()
process.nextTick ->
em.emit 'query data'
em.once '500', (err)->
console.log 'Error in import_data: ' + err
console.log err.stack
return em.emit 'error', err
em.once 'done', ->
return em.emit 'end'
em.once 'query data', ->
body = ''
reqGet = http.get "http://test.komoxo.com:5000/cut?date="+datetime,(response)->
response.on 'data', (chunk)->
body += chunk
response.on 'end', ()->
data = JSON.parse data
em.emit 'update data', data
reqGet.on 'error', (e)->
em.emit '500', e
reqGet.end()
em.once 'update data', (data)->
COL.update {date: datetime}, {$set: {count: data.data.a, total: data.data.n, placecount: data.data.c}}, {upsert: true}, (err)->
if err
em.emit '500', err
em.emit 'done'
if !module.parent
db = require('./db').defaultDb()
argv = process.argv[2..]
if argv[0]
datetime = argv[0]
l=exports.importRequestNumber db, datetime
l.once 'error', ->
process.exit -1
l.once 'end', ->
process.exit 0
直接用coffee命令执行程序没问题,但在crontab下执行报错 crontab 环境变量已设置 运行程序,http.get请求时报
Failed to load c++ bson extension, using pure JS version (这个警告应该没影响的。。。)
Error in import_data: Error: connect ECONNREFUSED
Error: connect ECONNREFUSED
at errnoException (net.js:646:11)
at Object.afterConnect [as oncomplete] (net.js:637:18)
不知道,哪位大神遇到过类似问题,跪求帮助啊。。。
8 回复
首先你得确定这个错误是来自query data
的阶段还是update data
的阶段,我怀疑是在update data
阶段出错的。
有无可能是那个db
对象打开了一个socket连接数据库服务器,但是在任务完成后,就直接process.exit 0
了,导致这个socket被占用。
因此,再次运行这个程序时,就被拒绝连接了。
@bnuhero 我开始也以为是update data阶段出错,后来监控了一下,在http.get阶段没触发em.emit 'update data’, data,而是reqGet.on 'error’, (e)-> em.emit '500’, e这里触发了;
那就很奇怪。不过有一点,根据http.get()的文档,与http.request()
相比,http.get()
有下列不同:
- 没有body
- 自动设置请求的方法为GET
- 自动调用
req.end()
所以,你的代码中的reqGet.end()
应该去掉。