【问题标题】:Is this the optimal way to perform operations to MongoDB through a node.js?这是通过 node.js 对 MongoDB 执行操作的最佳方式吗?
【发布时间】:2017-08-01 19:51:25
【问题描述】:

我已经编写了这段代码,我在其中启动了一个到我的 MongoDB 服务器的连接,并在内部这样的连接中执行了 Web 服务代码。

这是一种最佳或安全的方式吗?有什么更好的方法来实现这一点?

var express = require("express");
var mongodb = require("mongodb");
var servidor = new express();

var BSON = mongodb.BSONPure;
servidor.use(express.static(__dirname+"/publico"));
servidor.use(express.bodyParser());
var cliente_mongodb = mongodb.MongoClient;

cliente_mongodb.connect("mongodb://localhost/db_escuela", function(err, db_escuela){
    if(err){
        console.log("Error de conexion"+err);
    }else{
        console.log("Se ha conectado a la base de datos");
        var cl_alumnos = db_escuela.collection("cl_alumnos");

        servidor.get("/alumnos",function(peticion, respuesta){
            cl_alumnos.find().toArray(function(err,respuesta_db){
                respuesta.send(respuesta_db);
            });
        });

        servidor.get("/alumnos/:id",function(peticion,respuesta){
            var id = new BSON.ObjectID(peticion.params.id);
            cl_alumnos.findOne({'_id':id},function(err,respuesta_db){
                respuesta.send(respuesta_db);           
            });
        });

        servidor.post("/alumnos",function(peticion,respuesta){
            var nuevo_alumno={
                nombre:peticion.body.nombre,
                edad:peticion.body.edad,
                promedio:peticion.body.promedio
            };
            cl_alumnos.insert(nuevo_alumno,function(err,respuesta_db){
                console.log("Se ha insertado: "+JSON.stringify(respuesta_db));
                respuesta.send(respuesta_db);           
            });
        });

        servidor.delete("/alumnos/:id",function(peticion,respuesta){
            var alumno_eliminar = {
                _id : new BSON.ObjectID(peticion.params.id)
            }

            cl_alumnos.remove(alumno_eliminar,function(err,respuesta_db){
                if(err)
                    console.log("No se ha podido eliminar el registro");
                else
                    respuesta.send("Registro Eliminado");               
            });         
        });

        servidor.put("/alumnos/:id",function(peticion,respuesta){
            var id_editado={
                _id : new BSON.ObjectID(peticion.params.id)         
            };
            var alumno_editado={
                nombre:peticion.body.nombre,
                edad:peticion.body.edad,
                promedio:peticion.body.promedio
            };      
            cl_alumnos.update(id_editado, alumno_editado, function(err, respuesta_db){
                if(err)
                {
                    console.log("Error:"+err);
                }
                else
                {
                    console.log("Resultado "+respuesta_db);
                    respuesta.send("Actualizacion Exitosa");
                }
            });
        });


        servidor.listen(8080,function(){
            console.log("El servidor esta escuchando en el puerto 8080");
        });             
    }


});

【问题讨论】:

    标签: javascript node.js mongodb web-services database


    【解决方案1】:

    这很好,也很安全。与 MongoDB 的连接只进行一次。您正在向服务器的中间件添加引用此连接的匿名函数。

    就代码组织而言,有些人可能会建议将其分解一下。对于上述大小的应用程序,我认为没有问题。如果您计划增长,则可能需要进行一些重构。

    【讨论】:

    • 在连接成功回调中运行服务端意味着每个请求都有相同的连接对象,对吧?从最佳实践的角度来看,这可以吗?我问这个不是为了批评你的回答,而是为了理解你的观点。
    • @AlbertoZaccagni,这是正确的。每个请求将共享与 MongoDB 的相同连接。这实际上是鼓励的。您不希望每次发出请求时都连接到 MongoDB 的开销...通过共享连接,您可以将其重用于后续请求。
    • 谢谢,有道理。
    【解决方案2】:

    请不要害怕像 Mongoose 一样使用 ODM。它比您想象的更容易,并且可以解决您遇到的任何问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-20
      • 1970-01-01
      • 1970-01-01
      • 2012-10-02
      • 2014-12-03
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多