我正在构建一个NPM模块,它需要向自身(正在运行的web服务器)发出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
不是处理这个问题的最健壮的方法,这让我很紧张。
发布于 2016-03-29 10:09:33
自消耗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
}
}
to-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))
因此,我们现在有了一个连接到控制器功能的express应用程序。奇妙的是,我们也可以手动调用这些控制器函数。
var books = require('./books')
books.processLateFees().then(function () {
// late fees have been processed
})
如果你需要一个更深入的例子,Ghost blog的代码库是关于this pattern的built。这是一本内容非常丰富的读物。
发布于 2016-03-17 11:09:11
如果你只有一个nodejs应用程序,你可以把这个方法放在你的Model或Controller中,然后在应用程序中调用它,它需要的资源比创建一个新请求要少。
如果您有多个nodejs应用(或其他服务),则正常情况下会使用特定的URL和端口创建对其他web服务的请求。
发布于 2014-02-02 18:24:30
我在我的一个项目中做到了这一点,这很好用。到目前为止,我在dev和prod中使用它没有问题,因为我使用了几个nodejs应用程序和3个不同的web服务,它们调用自己来登录或检查身份验证。我同时使用express.js和sails.js (基于express.js)
https://stackoverflow.com/questions/18516339
复制相似问题