Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Вопрос пo express.js

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Без описания
clockwerk
Отправлено: 22 Октября, 2015 - 16:53:14
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




День добрый господа! Сейчас изучаю node.js + express.js
Вот возник вопрос допустим есть у меня файл роутинга:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var express = require('express');
  3. var router = express.Router();
  4. var Todo = require('../models/todo');
  5.  
  6. /* GET home page. */
  7. router.get('/', function(req, res, next) {
  8.   res.render('index');
  9. });
  10.  
  11. router.get('/api/todos', Todo.getAllTodo);
  12.  
  13.  


И есть файл models/todo.js

CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. 'use strict';
  3.  
  4.  
  5. var modelTodo = require('../dbModels/modelTodo');
  6. var Todo = {};
  7. var todo;
  8.  
  9. Todo.getAllTodo = function(req, res) {
  10.         modelTodo.find(function(err, todo){
  11.             if(err){
  12.               res.send(err);
  13.             }
  14.             res.json(todo);
  15.         });
  16. };
  17.  


Грубо говоря цель сделать todo List, Я сделал все работает, но модель вообще не должна знать о req и res, соответственно мне нужно как переделать функцию getAllTodo, я не могу понять как... Подскажите пожалуйста.

(Отредактировано автором: 22 Октября, 2015 - 16:54:15)

 
 Top
SAD
Отправлено: 22 Октября, 2015 - 17:49:08
Post Id



Постоянный участник


Покинул форум
Сообщений всего: 2508
Дата рег-ции: Май 2009  
Откуда: Днепропетровск, Украина


Помог: 75 раз(а)




вроде, все норм.
 
 Top
clockwerk
Отправлено: 22 Октября, 2015 - 17:57:18
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Ну оно и так нормально работает, но мне начальство сказало что модель не должна знать о res и req, вот я и не могу понять как можно изменить функции, вот и спросил здесь
 
 Top
and_07
Отправлено: 22 Октября, 2015 - 17:59:53
Post Id


Гость


Покинул форум
Сообщений всего: 91
Дата рег-ции: Сент. 2012  


Помог: 3 раз(а)




ну так правильно сказали


CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. var modelTodo = require('../dbModels/modelTodo');
  3. var Todo = {};
  4. var todo;
  5.  
  6. Todo.getAllTodo = function() {
  7.         modelTodo.find(function(err, todo){
  8.             if(err){
  9.               return err;
  10.             }
  11.             return todo;
  12.         });
  13. };
  14.  
 
 Top
IllusionMH
Отправлено: 22 Октября, 2015 - 18:01:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




clockwerk, ну так функция обработчик должна быть не в модели, а в файле роутера, либо вообще в отдельном. В этой функции и получайте нужные данные из запроса и вызывайте методы модели которые их вернут и в res уже пишите результат.

(Отредактировано автором: 22 Октября, 2015 - 18:02:04)

 
 Top
and_07
Отправлено: 22 Октября, 2015 - 18:01:25
Post Id


Гость


Покинул форум
Сообщений всего: 91
Дата рег-ции: Сент. 2012  


Помог: 3 раз(а)




CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.  
  3. router.get('/api/todos', function (req, res){ //Todo});
  4.  
 
 Top
clockwerk
Отправлено: 22 Октября, 2015 - 18:04:02
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Извините, но только недавно учусь node.js да и вобще js скриптам, возможно вопрос глупый..
Но как тогда мне в роутере делать? Так?
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. router.get('/api/todos', function(req, res){
  3.         if(!Todo.getAllTodo){
  4.                 res.send(err);
  5.         }else{
  6.                 res.json(Todo.getAllTodo);
  7.         }
  8.  
  9. });
  10.  

(Отредактировано автором: 22 Октября, 2015 - 18:05:43)

 
 Top
and_07
Отправлено: 22 Октября, 2015 - 18:07:14
Post Id


Гость


Покинул форум
Сообщений всего: 91
Дата рег-ции: Сент. 2012  


Помог: 3 раз(а)




ну нет как то так наверно


CODE (javascript):
скопировать код в буфер обмена
  1.  
  2.  
  3. Todo.getAllTodo = function() {
  4.         modelTodo.find(function(err, todo){
  5.             if(err){
  6.               return {'err': true, 'data':todo };
  7.             }
  8.            return {'err': false, 'data':todo };
  9.         });
  10. };
  11.  


а здесь проверяй ошибки

CODE (javascript):
скопировать код в буфер обмена
  1. router.get('/api/todos', function(req, res){



ну или шли клиенту результат и обрабатывай на стороне клиента

(Отредактировано автором: 22 Октября, 2015 - 18:09:48)

 
 Top
clockwerk
Отправлено: 22 Октября, 2015 - 18:12:30
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Ооо спасибо!! Я то думал как мне определить когда вызывать res.send, а когда , res.json, а тут вот оно решение на поверхности, возвращай массив и будет счастье! Спасибо!
 
 Top
clockwerk
Отправлено: 23 Октября, 2015 - 11:05:12
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Добрый день. Сегодня попробовал сделать так как советовал and_07, немного переделал:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. Todo.getAllTodo = function() {
  3.         var responce;
  4.         responce = modelTodo.find(function(err, todo){
  5.         if(err){
  6.           return {'err': true, 'data':todo };
  7.         }
  8.         return {'err': false, 'data':todo };
  9.     });
  10.     return responce();
  11. };
  12.  


Но вместо значений data и err в консоли выкидывает такую простыню
CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. Server has started, we`re listening to port 3030
  3. { options: {},
  4.   safe: undefined,
  5.   _conditions: {},
  6.   _updateArg: {},
  7.   _fields: undefined,
  8.   _geoComparison: undefined,
  9.   op: 'find',
  10.   model:
  11.    { [Function: model]
  12.      base:
  13.       { connections: [Object],
  14.         plugins: [],
  15.         models: [Object],
  16.         modelSchemas: [Object],
  17.         options: {} },
  18.      modelName: 'Todo',
  19.      model: [Function: model],
  20.      db:
  21.       { base: [Object],
  22.         collections: [Object],
  23.         models: {},
  24.         replica: false,
  25.         hosts: null,
  26.         host: '127.0.0.1',
  27.         port: 27017,
  28.         user: undefined,
  29.         pass: undefined,
  30.         name: 'todo',
  31.         options: [Object],
  32.         _readyState: 1,
  33.         _closeCalled: false,
  34.         _hasOpened: true,
  35.         _listening: true,
  36.         _events: {},
  37.         db: [Object] },
  38.      schema:
  39.       { paths: [Object],
  40.         subpaths: {},
  41.         virtuals: [Object],
  42.         nested: {},
  43.         inherits: {},
  44.         callQueue: [],
  45.         _indexes: [],
  46.         methods: {},
  47.         statics: {},
  48.         tree: [Object],
  49.         _requiredpaths: undefined,
  50.         options: [Object],
  51.         _events: {} },
  52.      options: undefined,
  53.      collection:
  54.       { collection: [Object],
  55.         opts: [Object],
  56.         name: 'todos',
  57.         conn: [Object],
  58.         queue: [],
  59.         buffer: false } } }
  60.  
  61.  


Не могу понять причину. Подскажите пожалуйста.

P.S. так же пробовал сделать так:
CODE (javascript):
скопировать код в буфер обмена
  1.  
  2. Todo.getAllTodo = function() {
  3.         var responce;
  4.         modelTodo.find(function(err, todo){
  5.        
  6.         if(err){
  7.           responce =  {'err': true, 'data':todo };
  8.         }
  9.         responce =  {'err': false, 'data':todo };
  10.     });
  11.     return responce;
  12. };
  13.  

По логике, если переменная объявлена за границами функции, то внутри функции ее значение должно измениться, но в консоли вобще ничего не выводит.

(Отредактировано автором: 23 Октября, 2015 - 11:26:21)

 
 Top
IllusionMH
Отправлено: 23 Октября, 2015 - 11:43:49
Post Id



Активный участник


Покинул форум
Сообщений всего: 4254
Дата рег-ции: Февр. 2011  
Откуда: .kh.ua


Помог: 242 раз(а)




clockwerk, используйте стандартный подход с колбэками cb(err, data), а не объектами/функциями. Вы вообще понимаете как работает асинхронный JS и что в последнем случае будет undefined, т.к. еще нет результата запроса на сервер?

Стоти глянуть хотябы сюда
https://scotch[dot]io/tutorials/buil[dot][dot][dot]de-and-express-4
а лучше книжку почитать, к примеру халявную Node.js Succinctly

(Отредактировано автором: 23 Октября, 2015 - 11:44:16)

 
 Top
clockwerk
Отправлено: 23 Октября, 2015 - 11:59:39
Post Id



Новичок


Покинул форум
Сообщений всего: 42
Дата рег-ции: Окт. 2015  


Помог: 0 раз(а)




Спасибо большое. Я теперь понял свою ошибку. И за ссылку тоже благодарю!
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB