Как и в случае с любыми другими приложениями, при написании приложений Node приходится решать сложные проблемы.
В этой статье мы рассмотрим некоторые решения распространенных проблем при написании приложений Node.
Получить путь из запроса
Мы можем получить путь из запроса, используя request.url для синтаксического анализа URL-адреса запроса.
Например, мы можем написать:
const http = require("http");
const url = require("url");
const onRequest = (request, response) => {
const pathname = url.parse(request.url).pathname;
console.log(pathname);
response.writeHead(200, { "Content-Type": "text/plain" });
response.write("hello");
response.end();
}
http.createServer(onRequest).listen(8888);
Все, что нам нужно сделать, это получить свойство request.url, чтобы получить URL.
Затем мы можем проанализировать его с помощью модуля url.
Затем мы можем получить pathname, чтобы получить относительный путь.
Преобразовать относительный путь в абсолютный
Мы можем преобразовать относительный путь в абсолютный, используя метод resolve модуля path.
Например, мы можем написать:
const resolve = require('path').resolve
const absPath = resolve('../../foo/bar.txt');
Мы вызываем resolve с относительным путем, чтобы вернуть абсолютный путь к файлу.
Получить длину строки в байтах
Мы можем получить длину строки в байтах, используя метод Buffer.byteLength.
Например, мы можем писать;
const byteLength = Buffer.byteLength(string, 'utf8');
Мы передаем string в Buffer.byteLength, чтобы получить длину строки в байтах.
Получение данных, переданных из формы в Express
Чтобы получить данные, передаваемые из формы в Express, мы можем использовать для этого пакет body-parser.
Затем, чтобы получить проанализированные результаты, мы можем получить их из свойства req.body.
Мы можем написать:
const bodyParser = require('body-parser'); app.use(bodyParser.urlencoded({ extended: true }));app.post('/game', (req, res) => { res.render('game', { ...req.body }); });
Мы вызываем app.post, чтобы создать маршрут POST, который получает тело запроса через req.body, потому что мы вызвали bodyParser.urlencoded для анализа данных, закодированных в URL.
extended, установленный на true, позволяет body-parser принимать данные, подобные JSON, внутри данных формы, включая вложенные объекты.
При использовании этого варианта нам не нужно отправлять пары "ключ-значение", как при отправке традиционной HTML-формы.
Запуск нескольких экспресс-приложений на одном порте
Мы можем использовать app.use, чтобы объединить несколько приложений Express и запускать их на одном порте.
Например, мы можем написать:
app
.use('/app1', require('./app1').app)
.use('/app2', require('./app2').app)
.listen(8080);
Мы требуем, чтобы app1 и app2 использовали маршруты от них обоих в одном приложении.
Затем мы вызываем listen для прослушивания запросов в порту 8080.
Изменить рабочий каталог с помощью NodeJs child_process
Мы можем изменить рабочий каталог с помощью опции cwd.
Например, мы можем написать:
const exec = require('child_process').exec;
exec('pwd', {
cwd: '/foo/bar/baz'
}, (error, stdout, stderr) => {
// work with result
});
Мы вызываем exec с объектом со свойством cwd, чтобы установить текущий рабочий каталог.
Затем мы получаем результат в обратном вызове.
Загрузите двоичный файл в S3 с помощью AWS SDK для Node.js
Мы можем загрузить двоичный файл в S3 с помощью Node.js AWS SDK с помощью пакета AWS.
Например, мы можем написать:
const AWS = require('aws-sdk');
const fs = require('fs');
AWS.config.update({ accessKeyId: 'key', secretAccessKey: 'secret' });
const fileStream = fs.createReadStream('zipped.tgz');
fileStream.on('error', (err) => {
if (err) {
console.log(err);
}
});
fileStream.on('open', () => {
const s3 = new AWS.S3();
s3.putObject({
Bucket: 'bucket',
Key: 'zipped.tgz',
Body: fileStream
}, (err) => {
if (err) {
throw err;
}
});
});
Мы используем пакет aws-sdk.
Сначала мы аутентифицируемся с помощью AWS.config.update.
Затем мы создаем поток чтения из файла с createReadStream.
Затем мы слушаем открываемый файл, прикрепляя слушателя к событию 'open'.
Затем мы создаем экземпляр AWS.S3.
И мы вызываем putObject, чтобы загрузить файл.
Bucket - это имя сегмента.
Key - это путь к файлу.
Body - это поток чтения созданного файла.
Мы также слушаем событие error на случай возникновения каких-либо ошибок.
Заключение
Мы можем получить путь к запросу с помощью свойства request.url, если мы используем модуль http для прослушивания запросов.
Чтобы преобразовать относительные пути в абсолютные, мы можем использовать метод resolve модуля path.
Мы можем загружать файлы с помощью S3, создав поток чтения и вызвав putObject.
Мы можем установить текущий рабочий каталог с помощью exec.