Heroku 和 multer
Heroku and multer
我制作了一个网络应用程序,可以让您使用 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])
它转到我的 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's filesystem is ephemeral: any changes you make will be lost the next time your dyno restarts, which happens frequently(每天至少一次)。
Heroku recommends storing uploads on something like Amazon S3. Here's a guide 专门用于 Node.js。
将文件存储在 S3 上后,您应该能够使用适当的库或可能通过 HTTP 检索它们,具体取决于您配置存储桶的方式。
如果您仍想使用 multer
,请查看 multer-s3
。
我制作了一个网络应用程序,可以让您使用 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])
它转到我的 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's filesystem is ephemeral: any changes you make will be lost the next time your dyno restarts, which happens frequently(每天至少一次)。
Heroku recommends storing uploads on something like Amazon S3. Here's a guide 专门用于 Node.js。
将文件存储在 S3 上后,您应该能够使用适当的库或可能通过 HTTP 检索它们,具体取决于您配置存储桶的方式。
如果您仍想使用 multer
,请查看 multer-s3
。