Как разделить запросы контроллера и базы данных для Node и pg-обещания - PullRequest
0 голосов
/ 26 июня 2018

Я пишу веб-приложение для отображения веб-страницы с контентом из базы данных PostgreSQL, используя NodeJS, express и pg-обещание.

У меня есть javascript базы данных под названием "db / location.js", который запрашиваеттаблица местоположений.

var db_global = require('./db');  # db.js is for building the database connection
var db = db_global.db;

var locationList = [];

// add query functions

module.exports = {      
  getAllLocationList: getAllLocationList,
  locationList: locationList
};

function getAllLocationList() {
  db.any('select * from location')
    .then(function (data) {
        console.log(data);
        locationList = data;
    }
  );
}

В папке маршрутов у меня есть javascript маршрута с именем locationRoute.js.

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

var db = require('../db/location');

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

/* GET the map page */
router.get('/locations', function(req, res) {
  db.getAllLocationList();
  console.log(db.locationList);

  res.render('locations', {
    title: "Express and Leaflet API", // Give a title to our page
    //jsonData: db.getAllLocations // Pass data to the View
    jsonData: db.locationList // Pass data to the View
  });
});

module.exports = router;

Когда вызывается "http://localhost:3000/locations",предполагается, что он отображает "location.jade", который должен отображать "db.locationList" в таблице.

Моя проблема в том, что "console.log (db.locationList);" всегда вызывается передЗапрос был выполнен. Это привело к тому, что «db.locationList» (jsonData) был пуст.

Я не хочу связывать уровень контроллера со слоем базы данных, но как решить проблему?

1 Ответ

0 голосов
/ 26 июня 2018

Я думаю, вы должны изменить свой db / location.js на что-то вроде этого ...

function getAllLocationList() {
  return db.any('select * from location');
}

Тогда вы будете делать что-то подобное на своих маршрутах ...

router.get('/locations', function(req, res) {
  db.getAllLocationList()
   .then(function(data) {
      res.render('locations', {
          title: "Express and Leaflet API", // Give a title to our page
          jsonData: data // Pass data to the View
      });
  });
  ...

В вашем примере console.log (db.locationList); выполняется до того, как данные станут доступны, потому что они асинхронные. Это не работает так, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...