Как и в случае с любыми другими приложениями, при написании приложений 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.