尝试使用browserid时,“node.js:throw e; // process.nextTick error”

时间:2012-04-02 15:54:37

标签: http node.js

我不打算使用request之类的其他模块,如何用http写这个, 将文章播种到browserid时我应该考虑什么?

错误:

$ coffee server.coffee 
  info  - socket.io started
to send
to write
end?

node.js:201
    throw e; // process.nextTick error, or 'error' event on first tick
          ^
Error: getaddrinfo ENOENT
  at errnoException (dns.js:31:11)
  at Object.onanswer [as oncomplete] (dns.js:140:16)

源:

ll = console.log

fs = require 'fs'
page = fs.readFileSync 'page.html', 'utf-8'
query = require 'querystring'

client = fs.readFileSync 'client.coffee', 'utf-8'
page = page.replace '@@@', client

handler = (req, res) ->
  res.writeHead 200, 'Content-Type': 'text/html'
  res.end page

http = require 'http'
app = http.createServer handler
app.listen 8000

io = (require 'socket.io').listen app
io.set 'log level', 1
io.sockets.on 'connection', (socket) ->
  socket.emit 'ready', 'go'

  socket.on 'assertion', (data) ->
    msg = query.stringify
      assertion: data
      audience: 'localhost:8000'

    options =
      host: 'https://browserid.org'
      path: '/verify'
      method: 'POST'
      headers:
        'Content-Type':  'application/x-www-form-urlencoded'
        'Content-Length': msg.length
    ll 'to send'
    request = http.request options, (response) ->
      str = ''
      ll 'prepare'
      response.on 'data', (chunk) ->
        str += chunk
        ll str
      response.on 'end', ->
        ll str
    request.write msg
    ll 'to write'
    request.end()
    ll 'end?'

使用长堆栈跟踪:

$ coffee server.coffee 
       info  - socket.io started
    to send
    to write
    end?
    Uncaught Error: getaddrinfo ENOENT
        at errnoException (dns.js:31:11)
        at Object.onanswer [as oncomplete] (dns.js:140:16)
    ----------------------------------------
        at EventEmitter.on
        at Array.<anonymous> (http.js:1147:12)
        at EventEmitter._tickCallback (node.js:192:40)
    ----------------------------------------
        at EventEmitter.nextTick
        at ClientRequest.onSocket (http.js:1115:11)
        at Agent.addRequest (http.js:938:9)
        at new ClientRequest (http.js:1068:16)
        at Object.request (http.js:1331:10)
        at Socket.<anonymous> (/home/chen/code/home/git/docview/learning/coffee/browserid/server.coffee:52:22)
        at Socket.$emit (events.js:67:17)
        at SocketNamespace.handlePacket (/usr/lib/nodejs/socket.io/lib/namespace.js:335:22)
    ----------------------------------------
        at EventEmitter.on
        at SocketNamespace.<anonymous> (/home/chen/code/home/git/docview/learning/coffee/browserid/server.coffee:37:19)
        at SocketNamespace.$emit (events.js:88:20)
        at connect (/usr/lib/nodejs/socket.io/lib/namespace.js:292:10)
        at /usr/lib/nodejs/socket.io/lib/namespace.js:308:13
        at SocketNamespace.authorize (/usr/lib/nodejs/socket.io/lib/namespace.js:252:5)
        at SocketNamespace.handlePacket (/usr/lib/nodejs/socket.io/lib/namespace.js:302:14)
        at Manager.handleClient (/usr/lib/nodejs/socket.io/lib/manager.js:669:30)
    ----------------------------------------
        at EventEmitter.on
        at Object.<anonymous> (/home/chen/code/home/git/docview/learning/coffee/browserid/server.coffee:35:14)
        at Object.<anonymous> (/home/chen/code/home/git/docview/learning/coffee/browserid/server.coffee:71:4)
        at Module._compile (module.js:441:26)
        at Object.run (/usr/lib/nodejs/coffee-script/lib/coffee-script/coffee-script.js:68:25)
        at /usr/lib/nodejs/coffee-script/lib/coffee-script/command.js:135:29
        at /usr/lib/nodejs/coffee-script/lib/coffee-script/command.js:110:18
        at [object Object].<anonymous> (fs.js:115:5)
        at [object Object].emit (events.js:64:17)
    Uncaught undefined

node.js:201
    throw e; // process.nextTick error, or 'error' event on first tick
          ^

1 个答案:

答案 0 :(得分:1)

查看http.request documentation,我们发现:

  

选项:

     
      
  • host:要发出请求的服务器的域名或IP地址。默认为“localhost”。
  •   
  • hostname:支持url.parse()主机名优先于主机
  •   
  • port:远程服务器的端口。默认为80。
  •   

您可以尝试使用这些选项:

options =
  hostname: 'browserid.org'
  port: 443
  path: '/verify'
  method: 'POST'
  headers:
    'Content-Type':  'application/x-www-form-urlencoded'
    'Content-Length': msg.length

修改 http.request不适用于SSL请求,为此,您需要使用https.request。更改为也会修复您的其他错误,默认端口为443,因此您可以根据需要从选项中省略该错误。