• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Node.js problem z crud'em Mongoose

Aruba Cloud - Virtual Private Server VPS
0 głosów
481 wizyt
pytanie zadane 26 czerwca 2017 w JavaScript przez Bartlomiej Bywalec (2,480 p.)

Siema mam problem poniewaz pokazuje mi blad ze

TypeError: products.find is not a function


router.get('/product/:id', function (req, res, next) {
  products.findById(req.params.id).exec(function (err, products) {
    if (err) {
      //return res.render("error", { title: "Error" });
      res.status(404).json({
        message: 'File Not Found 404'
      })
    } else {
      products.find({ _id: req.params.id }, function(err, products){
        if (err) {
          console.log('error');
        } else {
          console.log(product);
          res.json(product);
        }
      })
    }
  })
});

 

Cały kod:

http://wklej.org/id/3208866/

Powie mi ktoś co zrobiłem źle, ewentualnie jak to poprawić??

1 odpowiedź

0 głosów
odpowiedź 26 czerwca 2017 przez kubaapk Nałogowiec (44,270 p.)
wybrane 26 czerwca 2017 przez Bartlomiej
 
Najlepsza
Twój model nazywa się 'products',

później tutaj products.findById(req.params.id).exec(function (err, products), w callbacku zwracasz products,

a tutaj products.find próbujesz szukać po tym, co zwróciło Ci w zapytaniu  products.findById(req.params.id).exec(function (err, products), a nie po modelu. Popraw nazewnictwo i sprawdź czy zadziała.
komentarz 26 czerwca 2017 przez Bartlomiej Bywalec (2,480 p.)

W sumie 2x nie potrzebnie szukałem, zrobiłem tak;

 

router.get('/product/:id', function (req, res, next) {
  products.findById(req.params.id).exec(function (err, products) {
    if (err) {
      res.status(404).json({
        message: 'File Not Found 404'
      })
    } else {
         res.send(products);
    }
  })
});

Tylko mam pytanie jak odebrać to w angularze ?? jesli w products kryje sie zawartość doc

komentarz 26 czerwca 2017 przez kubaapk Nałogowiec (44,270 p.)

Napisz sobie jakąś factory do obsługi zapytań, nie rób tego w kontrolerze. 

Np.

(function(){
    'use strict';

    angular
        .module('factory.products', [])
        .factory('productsFactory', function($http){

            return {
               getProduct: function() {
                    return $http.get('URL/' + id);
               },
            }
        });
})();

getProduct jest promisem. W kontrolerze wstrzyknij ten factory i obsłuż np. w ten sposób:

productsFactory.getProduct(id)
  .then(function(res) {
      console.log(res.data) //tutaj będziesz miał to co zwróci Ci get
   }
  .catch(function(err){
      console.log(err); //nie zapomnij obsłużyć errora.
  });

 

komentarz 26 czerwca 2017 przez Bartlomiej Bywalec (2,480 p.)
edycja 26 czerwca 2017 przez Bartlomiej

A czy od strony Node może być coś takiego?

 


router.get('/product/:id', function (req, res, next) {
   res.render('product/product', { title: 'Express', id: req.params.id });
});


router.get('/productView', function (req, res, next) {
  console.log(req.body);
  products.findById(req.body.id).exec(function (err, products) {
    if (err) {
      res.status(404).json({
        message: 'File Not Found 404'
      })
    } else {
         res.json(products);
    }
  })
});

 

angular

	$scope.productView = function (id) {
		console.log(id);
		$http.get("/product/productView", { 'id': id }).then(function (resp) {
			$scope.product = resp.data;
			console.log(resp.data);
		})
	};

Wiem ze to promis, ale narazie coś taiego zrobiłem żeby tylko sprawdzic czy pobiera

Pierwsze zależy od renderowania a drugi do ładowania produktu?

komentarz 26 czerwca 2017 przez kubaapk Nałogowiec (44,270 p.)

Osobiście, jeśli to nie jest jakiś duży projekt, to całkowicie odpuściłbym server-side rendering. Zakładam, że umiesz obsługiwać routing w ng, to zrób sobie jakiś uniwersalny widok dla produktu, który będziesz uzupełniał innymi danymi.

Np. w kontrolerze obsługującym productView:
 

var productId = $stateParams.productId; 

productsFactory.getProduct(productId)
  .then(function(res) {
      $scope.productData = res.data; // i później sobie uzupełnij widok odpowiednimi danymi 
   }
  .catch(function(err){
      console.log(err);
  });

 

E:

W tym pierwszym renderujesz widok, strzelam, że z folderu /views/product/product.ejs/hb/jade, to drugie zwraca Ci produkt po ID z bazy.

komentarz 26 czerwca 2017 przez Bartlomiej Bywalec (2,480 p.)
problem w tym, że muszę się tego nauczyć;p pomożesz z tam tym?:)
komentarz 26 czerwca 2017 przez kubaapk Nałogowiec (44,270 p.)
Tutaj nie ma z czym pomagać nawet. Wydaje mi się, że wszystko dość jasno napisałem. Napisz dokładniej z czym masz problem.
komentarz 26 czerwca 2017 przez Bartlomiej Bywalec (2,480 p.)
No że mam tak jak wkleiłem Ci kod wyzej i w response do controllera mam null
komentarz 26 czerwca 2017 przez kubaapk Nałogowiec (44,270 p.)

Testowałeś np. Postmanem czy w ogóle node zwraca Ci cokolwiek?

Spróbuj też tak:


$http.get('/product/productView' + id)
    .then(function(res) {
         console.log(res);
     }

 

komentarz 26 czerwca 2017 przez Bartlomiej Bywalec (2,480 p.)
Ok działa, dzieki!

Podobne pytania

0 głosów
1 odpowiedź 295 wizyt
pytanie zadane 22 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
+1 głos
0 odpowiedzi 121 wizyt
pytanie zadane 20 września 2020 w JavaScript przez poldeeek Mądrala (5,980 p.)
0 głosów
0 odpowiedzi 171 wizyt
pytanie zadane 15 sierpnia 2020 w JavaScript przez Darth_Sith Początkujący (310 p.)

93,335 zapytań

142,330 odpowiedzi

322,409 komentarzy

62,670 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...