在NodeJS / ExpressJS中向自己发出HTTP请求

时间:2013-08-29 16:30:54

标签: javascript node.js express

我正在构建一个需要向自己(正在运行的Web服务器)发出HTTP请求的NPM模块。例如:

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

有没有办法通过NodeJS管道处理请求而不实际执行HTTP请求?

或者有更好的方法来形成网址吗?我很紧张127.0.0.1不是生产网站处理此问题的最有效方法。

4 个答案:

答案 0 :(得分:7)

自我消费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博客代码库built围绕this pattern。这是一篇内容丰富的读物。

答案 1 :(得分:1)

如果您只有一个nodejs应用程序,您可以将该方法放在模型或控制器中并在应用程序内部调用它,它需要的资源少于创建新请求所需的资源。

如果您有多个nodejs应用程序(或其他服务),则向具有特定URL和端口的其他Web服务创建请求是正常的。

答案 2 :(得分:0)

我在我的一个项目中这样做,并且工作正常。 到目前为止,我在dev和prod中使用它没有问题,因为我使用了几个nodejs应用程序和3个不同的Web服务,这些服务可以自己登录或检查身份验证。我同时使用express.js和sails.js(基于express.js)

答案 3 :(得分:0)

我认为使用请求模块是可以接受的,它非常快,我在进行单元测试时使用这种方法