2015-07-04 1 views
0

Я ищу, чтобы сделать экспресс-маршрут более модульным. Мне было интересно использовать обещание прочитать файл, а затем вернуть маршрут.Возвращение обещанного завернутого экспресс-маршрута в app.use()

Вот код:

var express = require('express') 
var router = express.Router() 
var app = express() 

var Promise = require("bluebird") 
var fs = Promise.promisifyAll(require("fs")) 

function promiseRoute(file){ 
    return fs.readFileAsync(file, "utf8") 
    .then(JSON.parse) 
    .then(function(file){ 
    if(!file.url) throw new Error("missing url") 
    router.get(file.url, function(req, res, next){ 
     return res.redirect("/hello") 
    }) 
    return router 
    }) 
} 

app.use(promiseRoute("../file.json")) 

var server = app.listen(3000, function() {}) 

также попытался

promiseRoute(path.join(__dirname, "./file.json")).then(app.use) 

И я получаю эту ошибку.

throw new TypeError('app.use() requires middleware functions') 

И это с обещанием.

Unhandled rejection TypeError: Cannot read property 'lazyrouter' of undefined 
    at use (/project/node_modules/express/lib/application.js:213:7) 
    at tryCatcher (/project/node_modules/bluebird/js/main/util.js:24:31) 
    at Promise._settlePromiseFromHandler (/project/node_modules/bluebird/js/main/promise.js:489:31) 
    at Promise._settlePromiseAt (/project/node_modules/bluebird/js/main/promise.js:565:18) 
    at Promise._settlePromises (/project/node_modules/bluebird/js/main/promise.js:681:14) 
    at Async._drainQueue (/project/node_modules/bluebird/js/main/async.js:123:16) 
    at Async._drainQueues (/project/node_modules/bluebird/js/main/async.js:133:10) 
    at Immediate.Async.drainQueues [as _onImmediate] (/project/node_modules/bluebird/js/main/async.js:15:14) 
    at processImmediate [as _immediateCallback] (timers.js:371:17) 

попытался Также это:

promiseRoute(path.join(__dirname, "./file.json")).then(function(router){ 
    app.use(function(req, res, next){ 
    return router 
    }) 
}) 

Как я могу вернуть обещание/маршрут app.use?

ответ

1

app.use требуется middleware функция. То есть, функция, которая принимает (req, res, next).

Так в целом:

app.use(function(req, res, next){ 
    promiseRoute(probably_pass_things_in).nodeify(next); 
}); 

nodeify для преобразования обещания обратного вызова next будет принимать. Обратите внимание, что существует промежуточное ПО для сторонних разработчиков, которое вы можете использовать.

+0

Эй Бенджамин! Благодаря! Я пытаюсь получить маршрут в файле и передать его в 'app.use', как этот http://expressjs.com/4x/api.html#router, и у меня возникли проблемы с тем, в этом обещании. – ThomasReggi

+0

'app.use' принимает либо объект' router', либо функцию anon '(req, res, next)' Я не думаю, что могу вернуть объект 'router' в' function (req, res, next) 'он висит на сервере. – ThomasReggi

0

Это сделал трюк:

promiseRoute(path.join(__dirname, "./file.json")).then(function(router){ 
    app.use(router) 
})