Страницы

Поиск по вопросам

понедельник, 3 декабря 2018 г.

Первый опыт в node.js Можно ли не переделывая с нуля получить сносный результат?

Мой первый опыт программирования, если не считать студенческих лабораторных на 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.

Комментариев нет:

Отправить комментарий