Страницы

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

пятница, 27 декабря 2019 г.

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

#nodejs #mongodb #инспекция_кода #express #mongoose


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



    


Ответы

Ответ 1



Как-то так стандартно выглядит запрос страницы всех юзеров: 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.

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

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