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

ben*_*ree 20 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){ 
  ...
});
Run Code Online (Sandbox Code Playgroud)

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

或者有更好的方法来形成URL?我很紧张,这127.0.0.1不是处理生产网站最强大的方法.

Jos*_*lik 11

自我消费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
  }
}
Run Code Online (Sandbox Code Playgroud)

到http.js

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

module.exports = function toHTTP (func) {
    return function (req, res) {
         func(req.params).then(function (data) {
             res.send(data)
         })
    }
}
Run Code Online (Sandbox Code Playgroud)

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))
Run Code Online (Sandbox Code Playgroud)

因此,我们现在有一个快速应用程序连接到控制器功能.奇妙之处在于我们也可以手动调用这些控制器功能.

var books = require('./books')
books.processLateFees().then(function () {
    // late fees have been processed
})
Run Code Online (Sandbox Code Playgroud)

如果您需要更深入的示例,Ghost博客代码库是围绕此模式构建的.这是一个非常翔实的阅读.

  • 这并不能回答问题。 (6认同)

Vad*_*est -1

我在我的一个项目中做到了这一点,效果很好。到目前为止,我在开发和生产中使用它没有任何问题,因为我使用了几个带有 3 个不同 Web 服务的 Nodejs 应用程序,这些服务调用自己来登录或检查身份验证。我同时使用express.js和sails.js(基于express.js)