• 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

Object Storage Arubacloud
0 głosów
309 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ź 197 wizyt
pytanie zadane 22 stycznia 2018 w JavaScript przez Anoonymous Obywatel (1,560 p.)
+1 głos
0 odpowiedzi 81 wizyt
pytanie zadane 20 września 2020 w JavaScript przez poldeeek Mądrala (5,980 p.)
0 głosów
0 odpowiedzi 127 wizyt
pytanie zadane 15 sierpnia 2020 w JavaScript przez Darth_Sith Początkujący (310 p.)

92,539 zapytań

141,382 odpowiedzi

319,476 komentarzy

61,928 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...