Героку и Малтер - PullRequest
       16

Героку и Малтер

0 голосов
/ 19 сентября 2018

Я сделал веб-приложение, которое позволяет загружать файл на сервер, используя multer.Он работает так, как должен, когда сервер запускается локально, но когда я развернул его на Heroku, кажется, что я столкнулся с внутренней ошибкой сервера 500.

Кто-нибудь имел дело с этим раньше?

Какие есть варианты?

Веб-приложение здесь: https://dupefinder.herokuapp.com/

Github-репо здесь: https://github.com/ExtDASH/herkodeploy

2018-09-19T19:38:48.310177+00:00 app[web.1]: POST /uploads 500 148 - 181.170 ms
2018-09-19T19:38:48.310830+00:00 app[web.1]: Error: ENOENT: no such file or directory, open 'uploads/csv1537385928295.csv'
2018-09-19T19:38:48.311255+00:00 heroku[router]: at=info method=POST path="/uploads" host=dupefinder.herokuapp.com request_id=ff1aaa34-f36c-49cf-bd4e-4a936fb48a2c fwd="24.52.32.175" dyno=web.1 connect=1ms service=188ms status=500 bytes=404 protocol=https

и вот ошибка консоли в браузере:

main.js:146 POST https://dupefinder.herokuapp.com/uploads 500 (Internal Server Error)
reader.onload @ main.js:146
load (async)
readFile @ main.js:131
invoker @ vue.js:2029
Vue.$emit @ vue.js:2538
click @ VBtn.ts:108
invoker @ vue.js:2029
fn._withTask.fn._withTask @ vue.js:1828

Я использую XMLHttpRequest POST-запрос:

readFile: function(){
        const input = document.querySelector('#myFile')
        const reader = new FileReader()
        reader.onload = function() {
            let csvfile = new Blob([reader.result], { type: 'text/csv' })
            app.uploadingFile = true

            const form = new FormData()
            let sendName = input.files[0].name.split(/\W+/g)

            form.append('Ncsv', csvfile, `${sendName[0]}.csv`)
            const xhr = new XMLHttpRequest()
            xhr.open('POST', '/uploads', true)
            xhr.onreadystatechange = function() {
                if(this.readyState == XMLHttpRequest.DONE && this.status == 200) {
                    form.delete('Ncsv')
                }
            }
            xhr.send(form)

        }
        reader.readAsText(input.files[0])

, который идет по маршруту app.post в моем файле server.js:

const express = require('express')
const connect = require('connect')
const morgan = require('morgan')
const bodyParser = require('body-parser')
const mongoose = require('mongoose')
const fs = require('fs-extra')
const multer = require('multer')
const getRouter = require('./routes/ourNums')
const nFs = require('./fileSchema.js')
const namesRouter = require('./routes/namesRouter.js')
const computeRouter = require('./routes/computeRouter.js')

// const uploadRouter = require('./routes/uploadRouter') unused for now
const filesRouter = require('./routes/filesRouter')
const path = require('path')



const app = express()

var storage = multer.diskStorage({
destination: function (req, file, cb) {
    fs.ensureFile(file)
    .then(() => {
        console.log('done')
     }
    cb(null, __dirname+'/uploads')
},
filename: function (req, file, cb) {
    var newName = file.originalname.split(/\W+/g)
    var fullName = `${newName[0]}${Date.now()}.csv`
    cb(null, fullName)
},
})



var upload = multer({ storage: storage })

app.use(express.json({limit: '50mb'}))
app.use(bodyParser.urlencoded({extended: false}))
app.use(bodyParser.json())
app.use(bodyParser.json({ limit: '50mb' }))
app.use(morgan('tiny')) //watching for changes
// app.use(express.static(`${__dirname}/client/index.html`))

app.post('/uploads', upload.single('Ncsv'), function (req, res, next) {
var fileName = req.file.filename
nFs.create({
    name: fileName
})
.then(data => res.status(200).send())
.catch(e => {
    req.error = e
    console.log(e)
    next()
})
})

раньше я не использовал fs для чего-либо (и как вы можете видеть здесь, fs.ensureFile ничего не делает для исправления ошибки 500), я просто включил его, чтобы начать игратьвокруг с этим.Запуск сервера локально, это работает.Я нажимаю кнопку загрузки на своем клиенте, и он отправляет любой файл, который я выбрал в качестве большого двоичного объекта, запускает его через multer и создает файл в /server/uploads/ каталоге

Редактировать: я только что попытался использовать multer.memoryStorage() иполучил ту же 500 внутреннюю ошибку сервера.

1 Ответ

0 голосов
/ 20 сентября 2018

Я не уверен, почему ваши загрузки не сохраняются;Вы должны быть в состоянии сохранить их временно.

Но это не будет работать в долгосрочной перспективе. Файловая система Heroku эфемерна : все сделанные вами изменения будут потеряны при следующем перезапуске вашего динамометра, что происходит часто (хотя бы раз в день).

Heroku рекомендует хранить загрузки на что-то вроде Amazon S3 .Вот руководство для того, чтобы делать это специально с Node.js.

После того, как вы сохранили свои файлы на S3, вы сможете получить их, используя соответствующую библиотеку или, возможно, через HTTP, в зависимости ото том, как вы настроили ваше ведро.

Если вы все еще хотите использовать multer, проверьте multer-s3.

...