Как бы я использовал данные возврата из контроллера в качестве данных EJS? - PullRequest
0 голосов
/ 04 мая 2018

У меня в разработке находится приложение Node.js, которое пытается получить список клиентов. Он использует последнюю версию Express и Passport.

Я пытаюсь добиться возврата данных из метода контроллера и использовать EJS для передачи данных в представление.

Пожалуйста, смотрите мой код ниже.

routes.js

var clientController = require('../app/controllers/clientController');

// Dashboard page.
// This should be protected, the user has to be logged in to make a request.
app.get('/dashboard', isLoggedIn, function (req, res) {
    var clientData = clientController.findAll;

    console.log(clientData) // This outputs '[Function]'

    res.render('dashboard.ejs', { user: req.user, clients: clientData })
})

clientController.js

const Client = require('../models/client');
var clientController = {}

clientController.findAll = function(req, res) {
    Client.find(function (err, clients) {
        res.send(clients)
    });
};

module.exports = clientController;

dashboard.ejs

<!-- I'm trying to keep it simple at the moment. -->
<%= clients %>

Текущее поведение приложения заключается в том, что оно просто выводит необработанный код Javascript.

function (req, res) {Client.find (функция (err, клиенты) {res.send (клиенты)}); }

Я не получаю никаких ошибок в консоли (кроме [function], о котором я упоминал ранее)

Если бы я изменил маршрут на app.get('/dashboard', clientController.findAll), он в некоторой степени работает, он будет отображать только вывод Json для пользователя. Это то, чего я не хочу. Я надеялся, что смогу вызвать другие контроллеры и «объединить» их в одном ответе.

Если бы кто-нибудь мне помог, я был бы очень признателен.

Спасибо

1 Ответ

0 голосов
/ 04 мая 2018

Есть проблемы, как вы пытаетесь достичь этого. Прежде всего вы определяете обработчик маршрута как анонимный, а затем пытаетесь вызвать метод контроллера с неправильным синтаксисом.

var clientData = clientController.findAll; Здесь не используется ().

Также ваш метод контроллера ожидает req,res, и в вашем контроллере вы использовали res.send(), который отправит ответ клиенту, никогда не вернет данные обратно обработчику маршрута.

Вы должны использовать следующий подход лучше и чище:

Вместо использования clientController для панели инструментов, вы должны создать один dashboardController и использовать его следующим образом:

routes.js

const clientController = require('../app/controllers/clientController');
const dashboardController = require('../app/controllers/dashboardController');

//simply use dashboardContrller.index as route handler
app.get('/dashboard', isLoggedIn, dashboardController.index); 

dashboardController.js

const Client = require('../models/client');
const dashboardController = {}

dashboardController.index = function(req, res) {
    Client.find(function (err, clients) {
      res.render('dashboard.ejs', { user: req.user, clients: clientData });
    });
};

module.exports = dashboardController;

Таким образом, вам не нужно будет беспокоиться о возврате данных или о чем-либо еще, и любая логика, связанная с приборной панелью, может быть помещена в этот контроллер.

Также вместо использования callbacks я бы рекомендовал прочитать о Promises и использовать их.

...