Я надсилаю з клієнта файл, витягую з запита в контроллері і передаю в функцію

const md5 = require('md5')
const fs = require('fs')
const path = require('path')

const cfg = {
  sizeLimit: 100 * 1000 * 1000,
}

const getHash = (file) => {
  const date = new Date()
  return md5(`${file.name}-${date.toString()}`)
}

const getExt = (file) => {
  return file.name.split('.')[file.name.split('.').length - 1]
}

const verifySize = (file) => {
  if (file.size > cfg.sizeLimit) {
    return { error: true, textUk: 'Надто великий файл' }
  }
}

const verifyExt = (file) => {
  const extListString = 'jpg,jpeg,png,webp,webm,mp4,doc,txt,pdf'
  const extList = extListString.split(',')
  const ext = getExt(file)
  if (extList.includes(ext)) {
    return { error: true, textUk: `Формат файлу .${ext} не підтримується. Дозволені формати - ${extListString}` }
  }
}

const uploadDir = '../public/files';
console.log(uploadDir)

module.exports = (file) => {
  verifySize(file)
  verifyExt(file)

  return new Promise((resolve, reject) => {
    const hash = getHash(file)
    const ext = getExt(file)
    console.log(hash, ext)
    console.log(file)
    fs.writeFile(
      uploadDir + `/${hash}.${ext}`,
      file,
      err => {
        if (err) {
          return reject(err)
        }
        resolve({
          url: `/files/${hash}.${ext}`
        })
      }
    )
  })
}

Приходить в функцію такий об'єкт

File {
  _events: [Object: null prototype] {},
  _eventsCount: 0,
  _maxListeners: undefined,
  size: 33311,
  path: 'C:\\Users\\shtye\\AppData\\Local\\Temp\\upload_777afc98ac96b2603f472c6f91d1260a',
  name: 'photo_2021-04-01_21-46-42.jpg',
  type: 'image/jpeg',
  hash: null,
...

Проблема виникає на етапі fs.writeFile

error TypeError [ERR_INVALID_ARG_TYPE]: The "data" argument must be of type string or an instance of Buffer, TypedArray, or DataView. Received an instance of File
    at Object.writeFile (fs.js:1487:5)

Я розумію що об'єкт File треба якось перетворити в Buffer. Пробував Buffer.from(file) але виникає помилка в buffer.

Не особливо розумію як ці об'єкти працюють
Помилка напевно в чомусь дуже тупому але через малий досвід роботи з файлами не можу знайти свою хибу.

Буду дуже вдячний за допомогу

2

(3 відповідей, залишених у Бази даних)

Дуже дякую!

В мене вийшло ось так:

UPDATE upload_file
SET formats = cast(REPLACE(cast(formats as varchar), 'https://investor-bucket.s3.eu-central-1.amazonaws.com', '/uploads') as jsonb);

Може комусь допоможе

3

(3 відповідей, залишених у Бази даних)

Можете підказати як можна замінити 'https://investor-bucket.s3.eu-central-1.amazonaws.com' на '/uploads', в колонці з форматом jsonb?

Ситуація така - є сайт на headless cms, потрібно пришвидшити його роботу оптимізувавши запити до бази даних. Там під капотом для зв'язку з бд використовується бібліотека knex, але думаю це не важливо.

Зараз я бачу як варіант спочатку витягую потрібні дані з однієї таблиці, дивлюсь які id другої і робилю новий запит неї. Так от, мені це здається не оптимальним, хоча хз я не впевнений чи можна витягнути з двох таблиць за один запит. Було би класно побачити приклад такого SQL або knex запиту(але це вже мрії).

А ще можете порадити матеріалів для навчання по базах даних(мені цікаві саме ідеї а не конкретні реалізації, курсів/книг купа а щось конкретне тяжко вибрати)

5

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

Ну, по локальній IP-адресі. У вас вона як бачу з налаштувань роутера 192.168.50.217. Якщо ви працюєте за тим же компом, де крутиться сервер, то можете просто писати localhost.

Боже оце я затупив, дуже дякую за допомогу, зате за пів дня краще розібрався в мережах ніж за все життя до того)
Ви витратили купу свого часу, хотів би вам якось віддячити. Я можу надіслати вам чи на розвиток replace.org.ua донат?

Та все ок, буває. Всі ми з чогось починали.  :)

Мені донат не треба, хіба можете підписатися на RSS-стрічку мого блоґу, я там іноді публікую статті про GNU/Linux і дотичне — може буде вам корисним.

От Реплейсу, думаю, донат не завадить, хоча навіть не знаю, куди це треба звертатися. Патреону нема, на жаль. Якщо з адмінів хтось знає, то хай відпише у темі.

Дякую ще раз, залип на вашому блозі)
А в replace знайшов кнопку для донату)

6

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

А покажіть-но конфіґи nginx'у.

Як я розумію, в межах LAN'у по всіх портах усе працює?

Не знаю як перевірити по LAN( Можете підказати що гуглити?

Ну, по локальній IP-адресі. У вас вона як бачу з налаштувань роутера 192.168.50.217. Якщо ви працюєте за тим же компом, де крутиться сервер, то можете просто писати localhost.

Боже оце я затупив, дуже дякую за допомогу, зате за пів дня краще розібрався в мережах ніж за все життя до того)
Ви витратили купу свого часу, хотів би вам якось віддячити. Я можу надіслати вам чи на розвиток replace.org.ua донат?

7

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

Та все те саме: порт 443 (https) закритий.

До речі, у вас тільки один фаєрвол?


Один на роутері(пробував включати/виключати це нічого не змінює) один в ubuntu(вона в мене чиста, тілики nginx поставив)

А покажіть-но конфіґи nginx'у.

Як я розумію, в межах LAN'у по всіх портах усе працює?

Не знаю як перевірити по LAN( Можете підказати що гуглити?

8

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

Та все те саме: порт 443 (https) закритий.

До речі, у вас тільки один фаєрвол?


Один на роутері(пробував включати/виключати це нічого не змінює) один в ubuntu(вона в мене чиста, тілики nginx поставив)

А покажіть-но конфіґи nginx'у.

Як я розумію, в межах LAN'у по всіх портах усе працює?

Єдине що змінював в nginx
https://replace.org.ua/uploads/images/6420/8d89404b537288de9811ca0b17a9b9bf.jpg
https://replace.org.ua/uploads/images/6420/d960be874ef2114143b068b716fcd551.jpg

9

(26 відповідей, залишених у Web-сервери)

koala написав:

А зсередини мережі 443 відкритий?

Маєте на увазі чи не блокує провайдер? І це якось можна перевірити(маю на увазі самому, вже завтра подзвоню до них спитаю як не вирішу, хоча мені майстер коли проводив інтернет то казав що порти не блокують)

10

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

О так, фізично перезавантажити може зарадити як не дивно. Я вирішив не питати зразу, бо гадав, що це надто очевидно.

Якщо й це не поможе, то спробую пошукати в англонеті за моделлю роутера — може хтось мав і вирішив схожі проблеми. Ви теж спробуйте.

Ще отаке знайшов, але не розумію що б це значило
https://replace.org.ua/uploads/images/6420/60fffdeaa69142ec7254b60ce5b4ac79.jpg

Та все те саме: порт 443 (https) закритий.

До речі, у вас тільки один фаєрвол?


Один на роутері(пробував включати/виключати це нічого не змінює) один в ubuntu(вона в мене чиста, тілики nginx поставив)

11

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

Так, значить порти таки закриті зовні. За локальною адресою як пінґуються?

І що це за роутер? Пробували перезавантажити?


Роутер Asus RT-AC58U V3
Пробував перезавантажити з адмінки зараз ще попробую фізично його вимнути і ввімкнути, хз наскільки це дієво але спробую

О так, фізично перезавантажити може зарадити як не дивно. Я вирішив не питати зразу, бо гадав, що це надто очевидно.

Якщо й це не поможе, то спробую пошукати в англонеті за моделлю роутера — може хтось мав і вирішив схожі проблеми. Ви теж спробуйте.

Ще отаке знайшов, але не розумію що б це значило
https://replace.org.ua/uploads/images/6420/60fffdeaa69142ec7254b60ce5b4ac79.jpg

12

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

Так, значить порти таки закриті зовні. За локальною адресою як пінґуються?

І що це за роутер? Пробували перезавантажити?


Роутер Asus RT-AC58U V3
Пробував перезавантажити з адмінки зараз ще попробую фізично його вимнути і ввімкнути, хз наскільки це дієво але спробую

О так, фізично перезавантажити може зарадити як не дивно. Я вирішив не питати зразу, бо гадав, що це надто очевидно.

Якщо й це не поможе, то спробую пошукати в англонеті за моделлю роутера — може хтось мав і вирішив схожі проблеми. Ви теж спробуйте.

Не помогло(

13

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:
bebyk написав:

Спробуйте тим, що порт пінґає. Наприклад, telnet, nmap. Або nc:

nc -vz <host> <port_number>


https://replace.org.ua/uploads/images/6420/1a6a5561fc6e698b2917b563bc9c635d.jpg

Так, значить порти таки закриті зовні. За локальною адресою як пінґуються?

І що це за роутер? Пробували перезавантажити?


Роутер Asus RT-AC58U V3
Пробував перезавантажити з адмінки зараз ще попробую фізично його вимнути і ввімкнути, хз наскільки це дієво але спробую

14

(26 відповідей, залишених у Web-сервери)

koala написав:

Ping працює з ICMP, тому відкриті порти TCP йому до одного місця.
Можете перевірити порт на https://www.yougetsignal.com/tools/open-ports/ чи будь-якому іншому ресурсі для цього, just google it.
Від мене 193.109.144.33:80 відкритий.

Перевіряв там, проблема в тому що не розумію чому 80 і 22 відкрились а 443 ні

15

(26 відповідей, залишених у Web-сервери)

bebyk написав:
shtyegor написав:

Ем, здається що працює, це ж так? Та чому тоді всілякі онлайн сервіси показують, що закритий(якщо все добре, надіюсь що все добре)? Я ж правильно пінгую?
https://replace.org.ua/uploads/images/6420/e6c5bcba8895261e3d7bb74d2da6775b.jpg

Спробуйте тим, що порт пінґає. Наприклад, telnet, nmap. Або nc:

nc -vz <host> <port_number>


https://replace.org.ua/uploads/images/6420/1a6a5561fc6e698b2917b563bc9c635d.jpg

16

(26 відповідей, залишених у Web-сервери)

Droid 77 написав:

Які порти бажаєте відкрити та що через них транслювати?
Якщо то звук то треба мабуть відкривати не тільки TCP а і UDP..

443, я буду хостити на ньому сайти і потрібен https

17

(26 відповідей, залишених у Web-сервери)

Ем, здається що працює, це ж так? Та чому тоді всілякі онлайн сервіси показують, що закритий(якщо все добре, надіюсь що все добре)? Я ж правильно пінгую?
https://replace.org.ua/uploads/images/6420/e6c5bcba8895261e3d7bb74d2da6775b.jpg

18

(26 відповідей, залишених у Web-сервери)

Вирішив зробити собі домашній сервер 80 і 22 порти відкрились а всі інші ні.
Чому таке може статись?

Налаштування роутера:
https://replace.org.ua/uploads/images/6420/ee25156317ea52e1b1b63705e6936276.jpg

Файлвол в юбунту:
https://replace.org.ua/uploads/images/6420/7b25a8914785d7157f022f985f7fe880.jpg

19

(0 відповідей, залишених у Пропоную роботу)

Головне бажати навчатись та базово знати html / css / js, всьому іншому навчимо

Які переваги?
Не беремось допилювати лайнопректи, всі проекти пишуться з нуля
Можливість подальшого переходу на щось цікавіше(vue/react)

Стек розробки
webpack + sass + postcss
vanillajs(від jQuery плануємо відмовитись)
bootstrap / foundation не використовуємо, лише стандартні інструменти css для адаптивності
для складніших рішень - vue.js

Контакти
https://телеґрам/unter_ua
hey@kover.agency

20

(4 відповідей, залишених у JavaScript, TypeScript, ECMAScript)

Я ще десь читав що є ще якийсь спосіб (не vuex)
Якщо хтось знає його, напишіть, буду дуже вдячний