Передать конфигурацию в контроллер
Я создаю узел.приложение js, которое будет загружать файлы в мое ведро S3 с помощью knox. Я могу взаимодействовать с S3, как ожидалось, но я хотел бы сделать мой контроллер для получения конфигурации, чтобы я мог динамически создавать своего клиента со значениями конфигурации.
мои вопросы: как мне получить параметры конфигурации вниз по стеку вызовов к моему контроллеру, не будучи небрежным?
отказ от ответственности: я довольно новыми для узла.js, так что это может быть просто мое отсутствие знания в разнице между экспортом. и модуль.поставляемый.*
вот пример, как работает мой код:
app.js
...
config = require('./config/config')['env'];
require('./config/router')(app, config);
...
маршрутизатор.js
module.exports = function(app, config) {
...
var controller = require('../app/controllers/home'); //Is there a way for me to pass config here?
app.post('/upload', controller.upload); //Or here?
...
}
дома.js
var knox = require('knox');
var client = knox.createClient({ ... }); //I want to use config.key, config.secret, etc instead of hard-coded values
...
exports.upload = function(req, res) {
//Use client
}
...
3 ответов
попробуйте сделать что-то вроде этого...
var config = require('./config/config')['env'];
// The use function will be called before your
// action, because it is registered first.
app.use(function (req, res, next) {
// Assign the config to the req object
req.config = config;
// Call the next function in the pipeline (your controller actions).
return next();
});
// After app.use you register your controller action
app.post('/upload', controller.upload);
а затем в вашем действии контроллера...
exports.upload = function(req, res) {
//Your config should be here...
console.log(req.config);
}
Ps. Я не могу попробовать прямо сейчас,но я решил подобную проблему.
Вы можете передать конфигурацию в качестве параметра контроллера
контроллер
// controller.js file
module.exports = function(req, res, config) {
console.log('config parameter passed to controller', config);
res.end('config passed')
}
App
// index.js file with the express app
var controller = require('./controller');
var config = {
key1: 'foo'
};
var express = require('express');
var app = express();
var port = 3000;
app.get('/', function(req, res){
controller(req, res, config);
});
app.listen(port);
console.log('app listening on port', 3000);
демо
Вы можете проверить GitHub РЕПО для полного примера
альтернативный подход, если вы хотите вызвать несколько функций из одного маршрута, это будет делать.
маршрут
var users = require('../controllers/users');
app.route('/login').post(function(req, res){
if(users.authenticate()){
console.log('valid user');
if(users.createUser())
{
console.log('user created');
}
}
});
контроллер
exports.authenticate = function(req, res, next) {
return true;
};
exports.createUser = function(req, res, next) {
return true;
};