我正在构建一个需要向自己(正在运行的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
不是生产网站处理此问题的最有效方法。
答案 0 :(得分:7)
在自耗JSON API中,您可以在某些独立控制器功能中定义某些功能,然后将功能连接到事后表达。我们以库应用程序为例:
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路由的函数。我们将查询参数作为选项传递给控制器:
module.exports = function toHTTP (func) {
return function (req, res) {
func(req.params).then(function (data) {
res.send(data)
})
}
}
然后我们将控制器连接到我们的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)
我认为使用请求模块是可以接受的,它非常快,我在进行单元测试时使用这种方法