2013-08-29 45 views
19

我正在構建需要向自己發送HTTP請求的NPM模塊(正在運行的Web服務器)。例如:在NodeJS/ExpressJS中創建HTTP請求自我

var url = "http://127.0.0.1:" + (process.env.PORT || 3000) + path; 
request(url, function(error, response, body){ 
    ... 
}); 

有沒有辦法通過NodeJS管道處理請求而不實際執行HTTP請求?

或者是否有更好的方式來形成網址?我很緊張,127.0.0.1不是處理生產現場最強大的方法。

+0

你有Express實例?如果是,我相信你可以簡單地觸發'request'事件。 – gustavohenke

+0

@gustavohenke是的,我可以要求訪問 - 你能舉個簡單的例子嗎? – bendytree

+0

無法發送請求來測試請求。來自mikeal的節點的http.request或請求庫足以發送請求。這就是你應該如何在服務器上運行測試。此外,這在服務器上運行,所以'127.0.0.1'應該可以正常工作。 – user568109

回答

0

我在我的一個項目中做到了,並且工作正常。 到目前爲止,我在dev和prod中沒有使用它,因爲我使用了幾個nodejs應用程序和3個不同的web服務,這些服務調用它們自己來登錄或檢查auhtentication。我同時使用express.js和sails.js(基於express.js)

0

我認爲使用請求模塊是可以接受的,這是相當快的,當我做單元測試

1

你可以把我用這個方法在Model或Controller中使用該方法,並在應用程序內部調用它,如果您只有一個nodejs應用程序,則需要的資源少於創建新請求的資源。

如果您有多個nodejs應用程序(或其他服務),那麼通過特定的URL和端口創建對其他Web服務的請求是正常的。

6

自使用JSON API

在自消費JSON API,您可以定義一些獨立的控制器功能的一些功能,然後連線功能了在事後表達。讓我們用一個圖書館應用爲例:

books.js

module.exports = { 
    browse: function() { 
     return Book.findAll() 
    }, 
    read: function (options) { 
     return Book.findById(options.book) 
    }, 
    processLateFees: function() { 
     // Do a bunch of things to process late fees 
    } 
} 

到http.js

在這個文件中,我們建立一個控制器功能轉換成HTTP路由功能。我們採取的查詢參數並傳遞給我們的控制器選項:

module.exports = function toHTTP (func) { 
    return function (req, res) { 
     func(req.params).then(function (data) { 
      res.send(data) 
     }) 
    } 
} 

router.js

然後我們我們的控制器連接到我們的http路由器

var express = require('express') 
var books = require('./books') 
var toHTTP = require('./to-http') 

var app = express() 
app.get('/books', toHTTP(books.browse)) 
app.get('/books/:book', toHTTP(books.read)) 
app.get('/batch-jobs/process-late-fees', toHTTP(books.processLateFees)) 

所以我們現在有一個連接到控制器功能的快速應用程序。而奇妙的是我們也可以手動調用這些控制器功能。

var books = require('./books') 
books.processLateFees().then(function() { 
    // late fees have been processed 
}) 

如果您需要在這個深度例如多,Ghost blog codebase目前圍繞這種模式建立。這是一個非常豐富的閱讀。

0

您可以使用Axios,它是一個基於Promise的HTTP客戶端,用於瀏覽器和node.js.它使得http請求可以在外部或內部進行,在這種情況下,內部將作爲主機降級到localhost

axios.get('http://localhost:port/end_point_name/some_route') .then(function (response) { console.log(response); }) .catch(function (error) { console.log(error); });