I'm training MongoDB and NodeJS, although I have some doubts. In my APP file I defined the following
Here I put my code (do not pay attention to the XD notes)
//esta variable almacena las funciones del paquete express, el cuál es el núcleo del framework
var express = require('express');
//esta variable almacena las funciones de la variable express, el cual le da vida a la página
var app = express();
//esta variable almacena las funciones del paquete mongoose el cual sirve para conectarse con MongoDB
var mongoose = require('mongoose');
//esta variable almacena las funciones del paquete body-parser, el cual sirve para traducir las peticiones en json
var bodyParser = require('body-parser');
//esta variable almacena las funciones del paquete cloudinary, el cual sirve para subir imagenes a la web
var cloudinary = require('cloudinary');
//esta variable almacena las funciones del paquete multer, el cual sirve para hacer más legibles de código las imágenes
var multer = require('multer');
//Se realiza la configuración de cloudinary con nuestra cuenta
cloudinary.config(
{
cloud_name:"***",
api_key:"***",
api_secret:"***"
});
//Aquí le decimos que se conecte a mongo, la ruta por defecto es esta.
mongoose.connect('mongodb://localhost/myPage');
//Aquí le indicamos a app que use las funciones de bodyParser.
app.use(bodyParser.json());
//Aquí le indicamos que desencripte la información enviada por POST o GET
app.use(bodyParser.urlencoded({extended: true}));
//Aqui mencionamos que habrá una carpeta de archivos estaticos.
app.use(express.static("public"));
//Le indicamos a Express que use a multer con los parámetros, de donde se subiran las imágenes y su será una sola, un array o ocualquiera.
app.use(multer({dest: "./uploads"}).single('image_avatar'));
//se creará un nuevo esquema de productos, es decir, el esqueleto del documento JSON
var productosSchema =
{
title:String,
desc:String,
imageUrl:String,
price:Number
};
//Creamos una nueva variable la cual
var Product = mongoose.model("Product", productosSchema);
//se indica a la aplicación que jade será será el motor de vistas
app.set("view engine", "jade");
/*get es el método HTTP, también se usa POST pero eso es usado cuando
se hacen envíos de formulario. El primer parámetro es conocer a cuál
URL esta haciendo la petición, en este caso es la raíz. El segundo
es la respuesta del servidor*/
app.get("/", function(req,res)
{
//se renderiza el index, el cual es el jade en views
res.render('index');
});
//renderiza el archivo new.jade y nos dá la descripción del body enviado
app.post("/menu", function(req,res)
{
//Aquí se crean los datos para la DB respetando el esqueleto que se definió arriba
//la información la sacamos del request y después de body y luego de cada campo
var data =
{
title : req.body.name,
desc : req.body.desc,
imageUrl : "",
price : req.body.price
}
//se crea una nueva variable y se estancia del modelo definido arriba y se envían los datos.
var product = new Product(data);
//se usa la sentencia de claudinary para subir las fotos.
cloudinary.uploader.upload(req.file.path,
function(result)
{
//antes de guardar el JSON en MongoDB, le decimos que la url viene del result
product.imageUrl = result.url;
product.save(function(err)
{
console.log(result);
console.log(product);
res.render("menu/new");
});
});
});
//Se salva la información y se manda un mensaje a la consola.
//Renderiza el archivo new.jade
app.get("/menu/new",function(req,res)
{
res.render("menu/new");
});
app.get("/menu",function(req,res)
{
Product.find(function(error,document)
{
if(error)
{
console.log(error);
}
else
{
res.render("menu/index",{productos : document})
}
});
});
//Aquí se define cual es el puerto de escucha.
port = 3000;
app.listen(port);
console.log("Servidor corriendo en el puerto " + port);
My question is, when I put data into Mongo, it was great, although I did not have that "Product" Collection, I created a collection called products, which I did not define in any part of the code as a new collection. That confuses me a lot, can someone help me tell me how that works?
Also, when I want to bring the Mongo data, I have to use the Product.find()
statement because if I use it as products.find()
, it marks me an error. What I mean is that, I'm not supposed to do the queries as I would write it in Mongo?