Мой первый опыт программирования, если не считать студенческих лабораторных на Delphi(и те были очень давно).
Цель: "приложение" которое на первой странице выдает кликабельный список из имен юзеров(имена берем в mongodb), а при клике на юзера перебрасывает на другую страницу, где уже отображает(беря из базы) подробные сведения о выбранном юзере.
Основательно переписал, получил вот это.
Вопросы:
Общая структура более-менее адекватна? Дорабатывать имеющееся или же переделывать с нуля?
В модуле userModel я подключаюсь к базе данных. Там предусмотрена простейшая обработка ошибки в виде сообщения в консоль. Как бы мне сделать так, чтобы эта ошибка попадала в express и я мог вывести в браузере объект ошибки?
//app.js:
var express = require('express');
var app = express();
var router = require('./router/router');
app.use(router);
app.listen(3000, function() {
console.log('Listening on port 3000!
Database on mlab.com');
});
//router.js:
var express = require('express');
GetFirstPage = require('../lib/GetPages').firstPage;
GetSecondPage = require('../lib/GetPages').secondPage;
var router = express.Router();
router.get('/', GetFirstPage);
router.get('/user?:id', GetSecondPage);
router.use(express.static('public'));
module.exports = router;
//userModel:
const mongoose = require('mongoose');
mongoose.connect(require('../credentials').mongo, function(err) {
if (err) console.log('Error database connection
', err)
});
const userShema = mongoose.Schema({
name: String,
age: String,
disciplines: String,
});
module.exports = mongoose.model('User', userShema);
//GetPages.js:
var express = require('express');
var app = express();
var _ = require('underscore');
const User = require('./exportFromDB').user;
const NamesList = require('./exportFromDB').namesList;
module.exports.firstPage = function(req, res) {
Promise.all([
NamesList(), readMainPage()
]).then(function(results) {
const list = results[0].map(function(item) {
return item.name
})
res.send(results[1]({
'list': list
}))
})
}
module.exports.secondPage = function(req, res) {
Promise.all([
User(decodeURIComponent(req.query.id)), readSecondPage()
]).then(function(results) {
res.send(results[1]({
name: results[0][0].name,
age: results[0][0].age,
disciplines: results[0][0].disciplines
}))
})
}
function readMainPage() {
const myFile = require('../lib/exportFile').mainPage;
return myFile();
}
function templateMainPage(template) {
res.send(template({
'list': List
}))
}
function readSecondPage() {
const myFile = require('../lib/exportFile').secondPage;
return myFile();
}
//ExportDB.js
userModel = require('./userModel');
module.exports.namesList = () => {
return new Promise(function(resolved, rejected) {
userModel.find({}, 'name -_id', function(err, data) {
resolved(data)
})
})
}
module.exports.user = (url) => {
return new Promise(function(resolved, rejected) {
userModel.find({
name: url
}, function(err, data) {
resolved(data)
})
})
}
Ответ
Как-то так стандартно выглядит запрос страницы всех юзеров:
app.get('/', function(req, res) {
users.find({}, (err, docs) => {
res.locals.users = docs;
res.render('list');
};
};
А в шаблоне страницы списка - юзеры выводятся в цикле each user in users, где каждый обёртывается в ссылку с атрибутом такого вида href="/users/#{user._id}" (или какой-там у вас синтаксис шаблонизатора)
А запрос страниц отдельных юзеров - app.get('/users/:id', ..., и в его обработчике, в объекте запроса значением параметра req.params.id будет айдишник юзера в базе, по которому он легко и запрашивается -
app.get('/users/:id', function(req, res) {
users.find({_id: req.params.id}, (err, result) => {
res.locals.user = result;
res.render('user');
};
};
Шаблон страницы получил объект юзера - user._id user.name user.age и т.д.
Всего и делов - спасибо ТиДжею Каравайчуку (или как там его) за Express.
Комментариев нет:
Отправить комментарий