如何从 MySql / Node.js 服务器动态检索文件?

Posted

技术标签:

【中文标题】如何从 MySql / Node.js 服务器动态检索文件?【英文标题】:How can I dynamically retrieve files from MySql / Node.js server? 【发布时间】:2022-01-04 14:48:16 【问题描述】:

我正在开发我的 CRUD 应用程序,我正在尝试从 mysql Nodejs 服务器下载文件。到目前为止我已经实现的步骤如下:

我创建了以下函数来查询 MySql 数据库以找到 id=179(只是一个随机 id)。该函数位于名为 userContoller.js 的文件中。

exports.readfile = (req, res) => 

    connection.query('SELECT * FROM user WHERE id="179"', (err, rows) => 
        if (!err) 
            res.render('index',  rows, layout: 'main3' );

         else 
            console.log(err);
        
        console.log('The data from user table:\n', rows);
    );

在另一个名为 index.hbs 的文件中使用 Handlebars,我使用 this.profile_image 获取文件

#each rows


#if this.profile_image
<a href="this.profile_image" download>

    <img class="card__image" src="this.profile_image" loading="lazy" >
    else
    <img class="card__image" src="/img/cert.png" loading="lazy" >
</a>


/if

在另一个文件user.js 中,我为/index 页面放置了路由器。

router.get('/index', userController.readfile);

一切正常。我想要做的是动态访问用户ID,而不是我插入'SELECT * FROM user WHERE id="179"'。为此,我创建了以下函数exports.viewall(也包含在userController.js 中)。 exports.viewall 函数下载文件的正确名称,而是下载 *.jpeg 版本下载无用的 *.html 版本,与 *.pdf 等其他类型的文件相同。

exports.viewall = (req, res) => 
    //User the connection
    connection.query('SELECT * FROM user WHERE id=?', [req.params.id], (err, rows) => 
        //when done with the connection, release it
        if (!err) 
            res.render('view-crew',  rows );
         else 
            console.log(err);
        
        // console.log('The data from user table:\n', rows);
    );

如何动态正确地查询 MySql/Nodejs 服务器以将文件下载到我的本地机器?

下面我放了app.js供参考:

const express = require("express");
const path = require('path');
const exphbs = require("express-handlebars");
const fileUpload = require('express-fileupload');
const mysql = require('mysql');
// to be removed when deployed in heroku

require("dotenv").config();
const cookieParser = require('cookie-parser');



// Parsing middleware
const app = express();

// default option
app.use(fileUpload());

//to load static file
app.use(express.static("public"));
app.use(express.static("upload"));
//Listen on port 5000
app.use(express.urlencoded( extended: false )); //To parse URL-encoded bodies (as sent by HTML forms)

app.use(express.json()); //To parse the incoming requests with JSON bodies
app.use(cookieParser());

app.engine("hbs", exphbs( extname: ".hbs" ));//Templating engine to change the extenion of file from .handlebar to .hbs
app.set("view engine", "hbs");


//link which tell to the server express.js to get the routeing from user.js
// const routes = require('./server/routes/user');
app.use("/", require('./routes/user'));
app.use('/auth', require('./routes/auth'));

// Connection Pool
var connection = mysql.createConnection(
    host: 'localhost',
    user: 'root',
    password: 'password',
    database: 'nodejs-login'
  );
  
  
  
  
  
  
  app.post('', (req, res) => 
  let sampleFile;
  let uploadPath;
  
  if (!req.files || Object.keys(req.files).length === 0) 
    return res.status(400).send('No files were uploaded.');
  
  
  // name of the input is sampleFile
  sampleFile = req.files.sampleFile;
  uploadPath = __dirname + '/upload/' + sampleFile.name;
  
  console.log(sampleFile);
  
  // Use mv() to place file on the server
  sampleFile.mv(uploadPath, function (err) 
    if (err) return res.status(500).send(err);
  
      connection.query('UPDATE user SET profile_image = ? WHERE id="179"', [sampleFile.name], (err, rows) => 
        if (!err) 
          res.redirect('/index');
         else 
          console.log(err);
        
      );
    );
  );



const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`Listening on port $port`));

【问题讨论】:

【参考方案1】:

您可以使用快速动态路由。并传递一个字符串变量用于查询 sql 数据库。像这样

app.post('/:id', (req, res) =>
const id = req.params.id.toString;
const queryString = `UPDATE user SET profile_image = ? WHERE id=$id`

connection.query( queryString, 
[sampleFile.name], (err, rows) => 
    if (!err) 
      res.redirect('/index');
     else 
      console.log(err);
    
  );
);

【讨论】:

您好,谢谢您的回答。我应该在哪里插入上述脚本?我是 node.js 的初学者。 这是一个例子,你不能在你的代码中插入它,你可以了解我是如何做到这一点的。【参考方案2】:

我重新思考了整个问题,以下是适合我的解决方案:

1- 在我的前端,我只需按照以下代码在我的车把链接前面添加../upload/ 到数据库:

&lt;a href="../upload/this.profile_image"&gt;DOWNLOAD&lt;/a&gt;

通过这种方式,我将链接重新路由到我在服务器上保存所有文件的文件夹。

2- 我修改了路由器,所以在客户端请求中以/:pic 动态获取图片

router.get('/upload/:pic', function (req, res) 
  var file = __dirname + '/../upload/' + req.params.pic;
  res.download(file);
);

3- 我离开控制器如下:

exports.viewall = (req, res) => 

    connection.query('SELECT * FROM user WHERE id=?', [req.params.id], (err, rows) => 
        if (!err) 
            res.render('view-crew',  rows );

         else 
            console.log(err);

        
        // console.log('The data from user table:\n', rows);
    );

通过这种方式,我根据前端代码创建了一个下载点,该代码从服务器下载任何文件,并从 MySql 数据库中获取名称引用:)

【讨论】:

以上是关于如何从 MySql / Node.js 服务器动态检索文件?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js - 连接到 MySQL 数据库服务器

从前端将数据发送回 node.js 服务器

如何使用 javascript/node js 从数据库中将图片动态加载到网页上

如何从node.js中的mysql获取最近添加的重新编码ID

如何使用 node.js&Mysql 从在线表单向数据库添加数据?

如何使用 Node.js 从 Angular 将日期插入 MySQL DATETIME 列?