2011-01-19 62 views
2

我剛剛開始一個node.js項目,並且正處於編寫我的第一個單元測試的階段。node.js當客戶端處於與服務器相同的進程中時,「由對等端重置連接」

在單元測試中,我啓動一個服務器,然後創建一個客戶端並向服務器發送一個請求。我會在迴應中做出斷言。

現在,如果我做到這一點使用兩個獨立的js文件,一個用於啓動服務器,其他客戶端,我在不同的節點實例上運行他們,它工作正常。服務器啓動後,我運行其他js,客戶端成功請求該請求。

但是,如果我把相同的代碼到一個單一的JS和一個節點實例中運行它,我得到「連接被對方​​復位」的錯誤,當客戶端試圖連接。我嘗試使用setTimeout在服務器啓動後將請求延遲幾秒鐘,然後嘗試捕獲套接字上的錯誤。這兩種方法似乎都沒有幫助。

我真的很希望能夠將這個作爲一個單獨的過程來運行。它使編寫和管理單元測試變得更加容易。有誰知道我做錯了什麼?

由於 馬丁

回答

1

documentation

server.listen(端口,[主機名], [回調])開始接受在指定端口上 連接和 主機名。如果主機名被省略, 服務器將接受指向任何IPv4地址 (INADDR_ANY)的連接 。

要收聽Unix套接字,供應 文件名而不是端口和主機名。

此功能是異步的。當服務器綁定到端口 時, 最後一個參數回調將被稱爲 。

server.listen(路徑,[回調])

我想你應該從callback裏面做單元測試?

至少它對我有用。我正在使用express.js,因爲它很棒。我也使用wwwdude發出http請求,但以下代碼段對我來說確實有效:

const PORT = 1234; 
const HOST = 'localhost'; 

const assert = require('assert'); 
const wwwdude = require('wwwdude'); 
const express = require('express'); 
const app = module.exports = express.createServer(); 
const client = wwwdude.createClient({ 
    headers: { 'User-Agent': 'wwwdude test 42' }, 
}); 

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

app.get('/', function(req, res) { 
    res.send('Hello World!'); 
}); 

if (!module.parent) { 
    app.listen(PORT, HOST, function() { 
     client.get('http://localhost:1234') 
     .addListener('error', function (err) { 
     }).addListener('success', function (data, resp) { 
      assert.equal('Hello World!', data); 
      process.exit(); 
     }).send(); 
    }); 
} 
+0

感謝您的回覆。但是,我不確定它是如何回答我的問題的。在文檔中我看不到任何東西,如果你在同一個進程中連接到來自客戶端的服務器,你需要做任何特殊的事情。也許我只是很慢,你能拼出來給我嗎? – martinp999 2011-01-20 20:46:12

相關問題