Подтвердить что ты не робот

Сделать запрос HTTP для себя в NodeJS/ExpressJS

Я создаю модуль NPM, который должен сделать HTTP-запрос самому себе (работающий веб-сервер). Например:

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 не самый надежный способ справиться с этим для производственных сайтов.

4b9b3361

Ответ 1

Самообучающийся API JSON

В самодостаточном API JSON вы определяете некоторые функции в некоторых автономных функциях контроллера, а затем прокладываете функциональные возможности, чтобы выразить их после факта. В качестве примера можно использовать приложение библиотеки:

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. Это очень информативное чтение.

Ответ 2

Вы можете поместить этот метод в свою модель или контроллер и вызвать его внутри приложения, если у вас есть только одно приложение nodejs, для этого требуется меньше ресурсов, чем для создания нового запроса.

Если у вас есть несколько приложений nodejs (или других служб), нормально создавать запрос к другим веб-службам с определенным URL-адресом и портом.

Ответ 3

Я делаю это в одном из моих проектов, и это работает отлично. Я использую его в dev и prod без проблем до сих пор, потому что я использую несколько приложений nodejs с 3 различными веб-службами, которые звонят себе для входа в систему или для проверки. Я использую как express.js, так и sails.js(на основе express.js)

Ответ 4

Я думаю, что использование модуля запроса приемлемо, оно довольно быстро, и я использую этот подход, когда выполняю модульные тесты

Ответ 5

Вы можете использовать Axios, который является HTTP-клиентом на основе Promise для браузера и 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); });