【问题标题】:Heroku and multerHeroku 和 multer
【发布时间】:2019-02-24 01:31:06
【问题描述】:

我制作了一个 Web 应用程序,可让您使用 multer 将文件上传到服务器。当服务器在本地运行时,它的工作方式与它应该的一样,但是当我将它部署在 Heroku 上时,似乎遇到了 500 内部服务器错误。

以前有人处理过吗?

有哪些选择?

Webapp 在这里: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])

在我的server.js 文件中转到app.post 路由:

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 错误),我只是将它包含在开头,以便我可以玩用它。在本地运行服务器,这是可行的。我单击客户端上的上传按钮,它会发送我选择的任何文件作为 blob,通过 multer 运行它,并在 /server/uploads/ 目录中创建文件

编辑:我刚刚尝试使用 multer.memoryStorage() 并得到相同的 500 内部服务器错误。

【问题讨论】:

  • 请运行heroku logs 并找出围绕 HTTP 500 错误的所有错误。 Edit您的问题并在此处包含该输出。如果选择它并单击{} 按钮或按Ctrl+K,它将被格式化为代码。
  • @Chris 完成。对此感到抱歉。
  • 似乎只是没有上传或创建文件。
  • 文件上传怎么样? (也请将此添加到您的问题中——我们通常不会离开现场查看代码。问题应该是独立的。)
  • 无需道歉 :-)。学习所有规则需要时间。您是长期需要这些上传,还是只是短期需要,以便对它们进行一些处理?

标签: node.js heroku web-applications multer


【解决方案1】:

我不确定您上传的内容为什么没有保存;您应该可以暂时保存它们。

但这不会长期有效。 Heroku's filesystem is ephemeral:您所做的任何更改都将在下次您的测功机重新启动时丢失,happens frequently(至少每天一次)。

Heroku recommends storing uploads on something like Amazon S3。这是 a guide 专门使用 Node.js 完成的。

将文件存储在 S3 上后,您应该能够使用适当的库或可能通过 HTTP 检索它们,具体取决于您配置存储桶的方式。

如果您仍想使用multer,请查看multer-s3

【讨论】:

    猜你喜欢
    • 2015-11-20
    • 2018-11-07
    • 2018-01-20
    • 2019-11-29
    • 2019-10-22
    • 2020-10-26
    • 2017-01-28
    • 2017-06-20
    • 1970-01-01
    相关资源
    最近更新 更多