📌  相关文章
📜  使用 Mongoose 在 MongoDB 上上传和检索图像

📅  最后修改于: 2022-05-13 01:56:31.046000             🧑  作者: Mango

使用 Mongoose 在 MongoDB 上上传和检索图像

先决条件:要开始使用,您应该熟悉NodeJSExpressJSMongoDBMongoose

  • NodeJS 它是一个免费的开源服务器环境,在服务器上使用JavaScript,运行在各种平台(Windows、Linux、Unix、Mac OS X等)上。它使用异步编程。
  • ExpressJS 它是一个 NodeJS Web 应用程序服务器框架,专为构建单页、多页和混合 Web 应用程序而设计。它是节点事实上的标准服务器框架。
  • MongoDB MongoDB 是一个 NoSQL 数据库。MongoDB 是一个 JSON 文档数据存储。它允许您存储和查询 JSON 样式的文档,顶部有一些智能。
  • Mongoose Mongoose 是一个用于 MongoDB 和 Node.js 的对象数据建模 (ODM) 库。 js。它管理数据之间的关系,提供模式验证,并用于在代码中的对象和 MongoDB 中这些对象的表示之间进行转换。

首先,安装所需的包和模块:

  • ExpressJS 允许我们设置中间件来响应 HTTP 请求。
npm install express --save
  • 模块“body-parser”可以读取(解析)HTTP-POST 数据。
npm install body-parser --save
  • Mongoose 是一个 MongoDB 客户端库,提供用于异步环境的对象建模。 Mongoose 支持 Promise 和回调。
npm install mongoose --save
  • Multer 是用于上传文件的nodejs中间件。
npm install multer --save
  • Dotenv 是一个零依赖模块,它将环境变量从 .env 文件加载到 process.env 中。
npm install dotenv --save
  • EJS(嵌入式 Javascript )是nodejs的模板引擎。该引擎有助于通过模板以最少的代码创建 HTML 页面。
npm install ejs --save
  • nodemon 是一个开发人员工具,当检测到代码目录中的文件更改时,它会自动重新启动节点应用程序。它改善了开发人员在处理基于节点的应用程序时的体验。由于这是一个开发工具,而不是我们应用程序代码的一部分,我们在安装这个模块时使用 `-save-dev`:
npm install nodemon --save-dev

现在让我们开始编码吧!要使用Mangoose通过MongoDB上传和检索图像,请一一执行以下每个步骤。

  • 第 0 步:创建将包含环境特定设置的文件 ` .env`
Javascript
MONGO_URL=mongodb://localhost/imagesInMongoApp
PORT=3000


Javascript
// Step 1 - set up express & mongoose
  
var express = require('express')
var app = express()
var bodyParser = require('body-parser');
var mongoose = require('mongoose')
  
var fs = require('fs');
var path = require('path');
require('dotenv/config');


Javascript
// Step 2 - connect to the database
  
mongoose.connect(process.env.MONGO_URL,
    { useNewUrlParser: true, useUnifiedTopology: true }, err => {
        console.log('connected')
    });


Javascript
// Step 3 - this is the code for ./models.js
  
var mongoose = require('mongoose');
  
var imageSchema = new mongoose.Schema({
    name: String,
    desc: String,
    img:
    {
        data: Buffer,
        contentType: String
    }
});
  
//Image is a model which has a schema imageSchema
  
module.exports = new mongoose.model('Image', imageSchema);


Javascript
// Step 3 - code was added to ./models.js
  
// Step 4 - set up EJS
  
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
  
// Set EJS as templating engine 
app.set("view engine", "ejs");


Javascript
// Step 5 - set up multer for storing uploaded files
  
var multer = require('multer');
  
var storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads')
    },
    filename: (req, file, cb) => {
        cb(null, file.fieldname + '-' + Date.now())
    }
});
  
var upload = multer({ storage: storage });


Javascript
// Step 6 - load the mongoose model for Image
  
var imgModel = require('./model');


Javascript
// Step 7 - the GET request handler that provides the HTML UI
  
app.get('/', (req, res) => {
    imgModel.find({}, (err, items) => {
        if (err) {
            console.log(err);
            res.status(500).send('An error occurred', err);
        }
        else {
            res.render('imagesPage', { items: items });
        }
    });
});


Javascript
// Step 8 - the POST handler for processing the uploaded file
  
app.post('/', upload.single('image'), (req, res, next) => {
  
    var obj = {
        name: req.body.name,
        desc: req.body.desc,
        img: {
            data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)),
            contentType: 'image/png'
        }
    }
    imgModel.create(obj, (err, item) => {
        if (err) {
            console.log(err);
        }
        else {
            // item.save();
            res.redirect('/');
        }
    });
});


Javascript
// Step 9 - configure the server's port
  
var port = process.env.PORT || '3000'
app.listen(port, err => {
    if (err)
        throw err
    console.log('Server listening on port', port)
})


HTML


  

    
    
    Image Uploading

  

    

To Upload Image on mongoDB

    
    
        
            
                                              
            
                                              
            
                                              
            
                             
        
    
       
       

Uploaded Images

    
        <% items.forEach(function(image) { %>         
            
                                 
                    
<%= image.name %>
                            

<%= image.desc %>

                         
            
        
        <% }) %>     
  


  • 第 1 步:创建我们的服务器文件` app.js` 。向其中添加以下代码:

Javascript

// Step 1 - set up express & mongoose
  
var express = require('express')
var app = express()
var bodyParser = require('body-parser');
var mongoose = require('mongoose')
  
var fs = require('fs');
var path = require('path');
require('dotenv/config');
  • 第 2 步:使用数据库的 URL 连接到 MongoDB。这里'process.env.MONGO_URL'用于数据库 URL。该值由模块 dotenv 从.env作为环境变量检索。将以下代码添加到` app.js`

Javascript

// Step 2 - connect to the database
  
mongoose.connect(process.env.MONGO_URL,
    { useNewUrlParser: true, useUnifiedTopology: true }, err => {
        console.log('connected')
    });
  • 第 3 步:一旦我们建立了与数据库的连接并需要所有必要的包,我们现在就可以开始定义我们的服务器端逻辑了。因此,为了在 MongoDB 中存储图像,我们需要使用 mongoose 创建一个模式。为此,创建文件 ` model.js`文件并定义架构。这里重要的一点是我们的图像数据类型是一个缓冲区,它允许我们将图像存储为数组形式的数据。

Javascript

// Step 3 - this is the code for ./models.js
  
var mongoose = require('mongoose');
  
var imageSchema = new mongoose.Schema({
    name: String,
    desc: String,
    img:
    {
        data: Buffer,
        contentType: String
    }
});
  
//Image is a model which has a schema imageSchema
  
module.exports = new mongoose.model('Image', imageSchema);
  • 第 4 步:我们想使用 Express 将 EJS 设置为我们的模板引擎。 EJS 专为构建单页、多页和混合 Web 应用程序而设计。它已成为 nodejs 的标准服务器框架。 EJS 的默认行为是它在 ` views`文件夹中查找要呈现的模板。我们将在后面的步骤中创建我们的模板。
    将以下代码添加到` app.js`

Javascript

// Step 3 - code was added to ./models.js
  
// Step 4 - set up EJS
  
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
  
// Set EJS as templating engine 
app.set("view engine", "ejs");
  • 第 5 步:我们将为要上传的图像定义存储路径。在这里,我们使用中间件 Multer 将照片上传到服务器的一个名为` uploads`的文件夹中,以便我们对其进行处理。
    将以下代码添加到` app.js`

Javascript

// Step 5 - set up multer for storing uploaded files
  
var multer = require('multer');
  
var storage = multer.diskStorage({
    destination: (req, file, cb) => {
        cb(null, 'uploads')
    },
    filename: (req, file, cb) => {
        cb(null, file.fieldname + '-' + Date.now())
    }
});
  
var upload = multer({ storage: storage });
  • 第 6 步:现在,通过将以下代码添加到app.js来加载 Image 模型:

Javascript

// Step 6 - load the mongoose model for Image
  
var imgModel = require('./model');
  • 第 7 步:设置对我们服务器的 GET 请求的处理程序。响应显示一个 HTML 页面,其中显示了存储在数据库中的所有图像,并提供了一个用于上传新图像的 UI。
    将以下代码添加到` app.js`

Javascript

// Step 7 - the GET request handler that provides the HTML UI
  
app.get('/', (req, res) => {
    imgModel.find({}, (err, items) => {
        if (err) {
            console.log(err);
            res.status(500).send('An error occurred', err);
        }
        else {
            res.render('imagesPage', { items: items });
        }
    });
});
  • 第 8 步:处理处理用户从我们的 HTML UI 提交的表单数据的 POST 请求。此请求将上传新图像。
    将以下代码添加到` app.js`

Javascript

// Step 8 - the POST handler for processing the uploaded file
  
app.post('/', upload.single('image'), (req, res, next) => {
  
    var obj = {
        name: req.body.name,
        desc: req.body.desc,
        img: {
            data: fs.readFileSync(path.join(__dirname + '/uploads/' + req.file.filename)),
            contentType: 'image/png'
        }
    }
    imgModel.create(obj, (err, item) => {
        if (err) {
            console.log(err);
        }
        else {
            // item.save();
            res.redirect('/');
        }
    });
});
  • 第 9 步:将服务器配置为默认端口,默认端口为3000 。如果在您的 ` .env ` 中设置,则使用环境变量process.env.PORT
    将以下代码添加到` app.js`

Javascript

// Step 9 - configure the server's port
  
var port = process.env.PORT || '3000'
app.listen(port, err => {
    if (err)
        throw err
    console.log('Server listening on port', port)
})
  • 第 10 步:这是“上传页面”的 HTML 模板。请注意,src参数不是典型的 URL。这种格式可以显示存储在 Mongo 数据库中的二进制格式的图像,我们将其转换为base64以便浏览器可以呈现它。
    将以下代码添加到` views/imagesPage.ejs`

HTML



  

    
    
    Image Uploading

  

    

To Upload Image on mongoDB

    
    
        
            
                                              
            
                                              
            
                                              
            
                             
        
    
       
       

Uploaded Images

    
        <% items.forEach(function(image) { %>         
            
                                 
                    
<%= image.name %>
                            

<%= image.desc %>

                         
            
        
        <% }) %>     
  
  • 第 11 步:创建目录 ` uploads`来保存我们上传的图片。步骤 8 中的代码引用此目录。
  • 第 12 步:通过运行以下命令启动服务器:` nodemon app.js`

输出打开浏览器到http://localhost:3000/ 。您现在应该看到:

演示

恭喜!你做到了!