#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:)