2015-06-23 2 views
2

У меня есть рабочий api для обслуживания изображений в маршруте на моем сервере server.js и хочу абстрагировать его на отдельный модуль.req.params undefined в модуле

перед:

app.get('/api/image/:filename', function(req, res){ 
    var resourcePath = 'uploads/public/projectnumber/issues/small/' + req.params.filename + '.png'; 

    console.log(resourcePath) 

    if(fs.existsSync(resourcePath)) { 
    var file = fs.readFileSync(resourcePath); 
    res.writeHead(200, 'Content-Type:application/pdf:image/png'); 
    res.end(file,'binary'); 
    } 
    else { 
    res.send(400, 'No image found'); 
    } 
}) 

Я хочу что-то вроде этого:

var ImageRouter = require('./routes/imageRouter'); 

app.use('/api/image/:filename', ImageRouter); 

и я пытался писать его, как это в моем файле imageRouter.js:

var express = require('express'); 
var fs = require('fs'); 
var router = express.Router(); 

router.use(function(req, res, next) { 
    var resourcePath = 'public/images/' + req.params.filename + '.png'; 

    if(fs.existsSync(resourcePath)) { 
    var file = fs.readFileSync(resourcePath); 
    res.writeHead(200, 'Content-Type:application/pdf:image/png'); 
    res.end(file,'binary'); 
    } 
    else { 
    res.send(400, 'No image found'); 
    } 

    next(); 
}); 

module.exports = router; 

Но req.params.filename не определено. Где я ошибся?

Спасибо!

+0

Что показывает в консоли, когда вы делаете 'console.log (req.params);'? –

+0

Это предполагаемое поведение. Решение Арно должно работать. Подробнее здесь -> https://github.com/strongloop/express/issues/2660 – Jordonias

ответ

1

Вы должны использовать get() на своем imageRouter.js маршрутизаторе и прикрепить его к основному приложению.

use() предназначено для средних предприятий.

Вот imageRouter.js:

var router = require('express').Router(); 
var fs = require('fs'); 

router.get('/:filename', function(req, res) { 
    var resourcePath = 'public/images/' + req.params.filename + '.png'; 

    if(fs.existsSync(resourcePath)) { 
    var file = fs.readFileSync(resourcePath); 
    res.writeHead(200, 'Content-Type:application/pdf:image/png'); 
    res.end(file,'binary'); 
    } 
    else { 
    res.send(400, 'No image found'); 
    } 
}); 

module.exports = router; 

И ваши server.js:

var express = require('express'); 
var app = express(); 

var ImageRouter = require('./routes/imageRouter'); 

app.use('/api/image', ImageRouter); 
+0

Работает как шарм. Большое спасибо! – mottosson

+0

Те, кому нужно ссылаться на параметр URL как '/: name 'в другом файле, проверьте этот вопрос: http://stackoverflow.com/questions/28977253/express-router-undefined-params-with-router-use-when -Сплит-через-файлы – George