Как я могу динамически извлекать файлы из MySQL / Node.js сервер?

#javascript #mysql #node.js #express #handlebars.js

#язык JavaScript #mysql #node.js #экспресс #handlebars.js

Вопрос:

Я работаю над своим приложением CRUD, что я пытаюсь сделать, это загрузить файлы с сервера MySQL Nodejs. Вот шаги, которых я достиг до сих пор:

  • Я создаю приведенную ниже функцию для запроса базы данных MySQL, чтобы найти id=179 (просто случайный идентификатор). Функция находится внутри файла под названием userContoller.js.
 exports.readfile = (req, res) =gt; {   connection.query('SELECT * FROM user WHERE id="179"', (err, rows) =gt; {  if (!err) {  res.render('index', { rows, layout: 'main3' });   } else {  console.log(err);  }  console.log('The data from user table:n', rows);  }); } 

С помощью руля в другом файле под названием index.hbs я беру файл с {{this.profile_image}}

 {{#each rows}}   {{#if this.profile_image}} lt;a href="{{this.profile_image}}" downloadgt;   lt;img class="card__image" src="{{this.profile_image}}" loading="lazy" alt="User Profile"gt;  {{else}}  lt;img class="card__image" src="/img/cert.png" loading="lazy" alt="User Profile"gt; lt;/agt;   {{/if}}  

В другом файле user.js я разместил маршрутизатор для /index страницы.

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

Все работает нормально. Что я хочу сделать, так это динамически получить доступ к идентификатору пользователя, вместо того, чтобы вставлять 'SELECT * FROM user WHERE id="179"' его . Для достижения этой цели я создаю следующую функцию exports.viewall (также включенную в userController.js ). exports.viewall функция загружает правильное имя файла, но вместо того, чтобы загружать версию *.jpeg, загружайте БЕСПОЛЕЗНУЮ версию *.html и то же самое с другими типами файлов, такими как *.pdf.

 exports.viewall = (req, res) =gt; {  //User the connection  connection.query('SELECT * FROM user WHERE id=?', [req.params.id], (err, rows) =gt; {  //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);  }); } 

How can I dynamically properly query the MySql/Nodejs server to download the file to my local machine?

for reference below I put the 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) =gt; {  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) =gt; {  if (!err) {  res.redirect('/index');  } else {  console.log(err);  }  });  });  });    const port = process.env.PORT || 5000; app.listen(port, () =gt; console.log(`Listening on port ${port}`)); 

Ответ №1:

Вы можете использовать экспресс-динамические маршруты. И передайте строковую переменную для запроса базы данных sql. подобный этому

 app.post('/:id', (req, res) =gt;{ const id = req.params.id.toString; const queryString = `UPDATE user SET profile_image = ? WHERE id=${id}`  connection.query( queryString,  [sampleFile.name], (err, rows) =gt; {  if (!err) {  res.redirect('/index');  } else {  console.log(err);  }  }); });  

Комментарии:

1. Привет, спасибо за ваш ответ. Куда я должен вставить приведенный выше скрипт? Я новичок в node.js.

2. это пример, вы не можете вставить это в свой код, вы можете узнать, как я это делаю.

Ответ №2:

Я переосмысливаю всю проблему, и вот решение, которое работает на меня:

1 — На моей лицевой стороне я просто добавляю ../upload/ перед своим рулем ссылку на базу данных в соответствии с приведенным ниже кодом:

lt;a href="../upload/{{this.profile_image}}"gt;DOWNLOADlt;/agt;

Таким образом, я перенаправляю ссылку на папку, в которой я храню все файлы на своем сервере.

2 — Я модифицирую маршрутизатор, поэтому динамично получаю изображение с /:pic запросом на стороне клиента

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

3 — Я оставил контроллер следующим образом:

 exports.viewall = (req, res) =gt; {   connection.query('SELECT * FROM user WHERE id=?', [req.params.id], (err, rows) =gt; {  if (!err) {  res.render('view-crew', { rows });   } else {  console.log(err);   }  // console.log('The data from user table:n', rows);  }); } 

Таким образом, я создаю точку загрузки в соответствии с кодом интерфейса, который загружает любой файл с сервера, используя ссылку на имя из базы данных MySQL:)