24

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

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

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

或者有没有更好的方法来形成 URL?我很紧张这127.0.0.1不是为生产站点处理此问题的最可靠方法。

4

4 回答 4

12

自消费 JSON API

在自消费 JSON API 中,您在一些独立的控制器函数中定义一些功能,然后将这些功能连接起来以便在事后表达。让我们以库应用程序为例:

书籍.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
  }
}

to-http.js

在这个文件中,我们构建了一个将控制器函数转换为 HTTP 路由的函数。我们获取查询参数并将其作为选项传递给我们的控制器:

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

路由器.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 博客代码库就是围绕这种模式构建的。这是一本内容丰富的读物。

于 2016-03-29T02:09:32.533 回答
0

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

如果您有多个 nodejs 应用程序(或其他服务),通常会使用特定的 URL 和端口创建对其他 Web 服务的请求。

于 2016-03-17T03:09:11.490 回答
-1

我在我的一个项目中做到了,效果很好。到目前为止,我在 dev 和 prod 中使用它没有问题,因为我使用了几个 nodejs 应用程序和 3 个不同的 Web 服务,它们调用自己来登录或检查 auhtentication。我同时使用 express.js 和sails.js(基于 express.js)

于 2014-02-02T10:24:29.697 回答
-1

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

于 2014-02-02T11:52:01.840 回答