const upload = multerConfig.single('userPic')
upload(req, res, (err) => {
if (err) {
reject(err)
}
else {
resolve(updateBaseUrl + imgPath + req.file.filename)
}
})
有人知道为什么upload()里面的代码为什么执行不了吗?我在本地widow环境时是可以正常运行的。放到云服务器中linux环境可以正常存储文件,但是upload()之后的代码就执行不了,导致服务器无响应
下面是完整代码
//multerConfig.js
const multer = require('multer');
const md5 = require('md5')
const path = require('path');
const { error } = require('console');
const resolve = (dir) => {
return path.join(__dirname, './', dir)
}
const storage = multer.diskStorage({
destination: function (req, file, cb) {
// 3.1.1 允许图片上传
try {
if (file.mimetype === 'image/jpeg' || file.mimetype === 'image/png') {
cb(null, resolve('../uploads/infosPic'))
} else {
// 3.1.2 限制其他文件上传类型
cb(null, new Error('cuowu'))
}
}
catch {
req.cc(error)
}
},
// 3.2 存储名称
filename: function (req, file, cb) {
try {
let fileFormat = (file.originalname).split(".");
cb(null, md5(+new Date()) + "." + fileFormat[fileFormat.length - 1]);
}
catch {
req.cc(error)
}
},
});
const multerConfig = multer({
storage: storage,
});
// 5. 导出配置好的multerConfig
module.exports = multerConfig;
//修改头像
exports.updateUserpic = async (req, res) => {
const updateBaseUrl = "http:/*****" // 上传到服务器地址
const imgPath = "/api/img/infosPic/" // 上传到服务器的虚拟目录
new Promise((resolve, reject) => {
const upload = multerConfig.single('userPic')
upload(req, res, (err) => {
if (err) {
reject(err)
}
else {
resolve(updateBaseUrl + imgPath + req.file.filename)
}
})
}).then(imgUrl => {
const updataSql = `update userinfo set userpic = ? where id = ?`
const selectSql = `select userpic from userinfo where id = ?`
//查询到原头像的地址,保存到OldUserPic中
let OldUserPic
db.query(selectSql, req.user.id, (err, results) => {
if (err) {
return req.cc(err)
}
if (results.length != 1) {
return req.cc('原头像地址获取失败')
}
else {
OldUserPic = results[0]
}
})
//将数据库用户信息修改
db.query(updataSql, [imgUrl, req.user.id], (err, results) => {
if (err) {
return req.cc(err)
}
if (results.affectedRows !== 1) {
return req.cc('修改失败!请稍后重试!')
}
else {
const regex = /infosPic\/(.*)/;
const match = OldUserPic.userpic.match(regex)
if (match) {
fs.unlink(resolve('../uploads/infosPic/' + match[1]), (err) => {
console.log(err);
})
}
//将地址传给客户端
res.send({
imgUrl,
status: 0,
message: "修改成功!"
})
针对你的问题结合chatgpt知识库请参考以下内容:
根据你提供的代码片段,以下是我能看到的一些潜在问题及解决方案:
在 multerConfig.js
中,你通过相对路径指定了文件存储位置。然而,在 Linux 系统上,相对路径的起始点可能有所不同。建议修改为绝对路径,并确保该目录存在、可写。
建议在上传成功时增加响应的 http 状态码和信息,如 res.status(200).send('upload success');
等。这能帮助开发者更快地定位错误。
在 exports.updateUserpic
函数中,你查询了更新前的用户头像地址,但是你没有等到查询结果就去修改数据库了。这可能导致数据不一致或更新失败。建议将数据库更新操作放在查询操作后面。
代码片段缺失了最后一个 fs.unlink()
方法中的闭合括号()
),这可能会影响程序的正确性。请确保代码的准确性。
根据你提供的信息,无法确定你遇到的问题是什么。如果上述方法没有解决你的问题,请在代码执行过程中逐一排查错误,并注意查看服务器日志以获取更多的信息。