@Stopy

Как строить свое приложение node.js+express+mongodb (router, ajax)?

1) Как обрабатывают ajax запрос в nodejs в плане архитектуры? Т.е. в express используя middleware:
var send_mail = require('./models/send_mail.js');
app.post('/send_mail', function(req,res,next){
  	send_mail(req.body, new Date());
});

Или это делается как то по другому?
2) Как вставлять данные из базы в шаблон?
var send = ('./models/send.js');
app.get('/send', function(req,res,next){
 res.render('main', data);
});

Если так, то как вернуть асинхронно данные из send.js и вставить в рендер? А если не так, то как?

3) С express тоже можно сделать какой-нибудь красивый роутер или нужно прямо в app.js сувать middleware'ы? (я знаю что можно сделать вообще хоть весь сайт в 1 файле, но меня интересует как сделать правильно и удобно)

P.S. В node.js 2 дня, прощу не кидать камнями а давать конструктивные ответы. В заранее спасибо!
  • Вопрос задан
  • 2669 просмотров
Решения вопроса 1
dizballanze
@dizballanze
Software developer at Yandex
1) Ajax запросы обрабатывать так же как и обычные запросы. Функция send_mail из примера вероятно должна принимать callback:

var send_mail = require('./models/send_mail.js');
app.post('/send_mail', function(req,res){
  	send_mail(req.body, new Date(), function(err) {
    if (err)
      res.send({result: false, message: err.message}); // отправляется json
    else
      res.send({result: true});
  });
});


2) Доступ к БД в node.js почти всегда асинхронный, соответственно для получения данных драйвер БД предоставляет callback, который также должна принимать ваша функция send:

var send = require('./models/send.js');
app.get('/send', function(req,res){
  send(function(err, data) {
    if (err) throw err; // или как-то по другому обрабатывать
    res.render('main', data);
  });
});


3) В одном файле можно разве что очень простое приложение писать, ну или какой-то пример. В реальных проектах все разбивается на модули, примеров море на GitHub.

----

Функция send примерно так должна выглядеть:

function send(cb) {
  // ... соединение с БД предполагается в переменной db
  var collection = db.collection('documents');
  collection.find({}).toArray(cb);
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
k12th
@k12th
console.log(`You're pulling my leg, right?`);
1) AJAX-запросы везде и всегда обрабатываются ровно так же, как и обычные. В чем ваш вопрос — как отличить AJAX от не-AJAX? как послать клиенту JSON?

2) Как-то так:
var send = require('./models/send.js');
app.get('/send', function(req, res) {
  send(function (err, data) {
    if (err) {
      return res.send(500, 'Error happened')
    } else {
      res.render('main', data);
    }
  })
});

С поправкой на callback-hell, если в базу надо сходить много раз:) (решается модулем async).

3) Зачем в одном файле? роуты, контроллеры, служебные миддлвари — все это можно и нужно раскидывать по разным файлам и даже по разным папкам. В app.js только создается инстанс и ему скармливаются настройки и роуты.

P.S. Посмотрите на https://github.com/madhums/node-express-mongoose-demo, возможно, часть вопросов это прояснит. Только не копируйте бездумно, там есть и спорные решения.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы