new Date() return 相同的变量值
new Date() return same value when it comes to variable
我 API 通过快递构建。然后我尝试使用格式为 multer 创建用于存储图像的动态文件夹:'YYYY/MMMM/DD' 并将其设置为变量。
const moment = require('moment')
const multer = require('multer')
const fs = require('fs')
let x = new Date()
let yearDir = moment(x).format('YYYY')
let monthDir = moment(x).format('MMMM')
let dateDir = moment(x).format('DD')
let dynamicDir = `${yearDir}/${monthDir}/${dateDir}`
// multer storage
const storage = multer.diskStorage({
destination: function (req, file, cb) {
if (fs.existsSync(dynamicDir)) {
console.log('upload dir is exist')
} else {
fs.mkdirSync(dynamicDir, {
recursive: true
})
console.log('upload dir not found, creating...')
}
cb(null, dynamicDir)
},
filename: function (req, file, cb) {
cb(null, file.originalname)
}
})
let uploadFile = multer({
storage: storage
})
module.exports = uploadFile
但是当日期改变和图片上传时,图片的目录总是不变的。
const { Router } = require('express')
const router = Router()
const uploadCtrl = require('../controllers/upload.js')
const uploadFile = require('../config/multer.js')
router.post('/upload', uploadFile.single('image'), uploadCtrl)
export default router
能否将 new Date() 设置为变量,或者我需要在瞬间编写它们,例如:moment(new Date()).format('DD') ?
不,您实际上是在以正确的方式进行操作:如果您这样做,您的代码有(轻微)机会在日期的边缘执行:
let yearDir = moment( new Date() ).format('YYYY')
let monthDir = moment( new Date() ).format('MMMM')
您实际遇到的问题是模块的代码总是只执行一次。所有后续的导入和需求都会消耗执行的结果。这意味着 dynamicDir
的值在计算后保持不变。
面对这样的挑战,总有一个相当直接的解决方案:用函数替换变量。在这种情况下,它看起来像这样(但可以大大简化;如果您想查看如何,请向下滚动)
const getDynamicDir = () => {
let x = new Date()
let yearDir = moment(x).format('YYYY')
let monthDir = moment(x).format('MMMM')
let dateDir = moment(x).format('DD')
return `${yearDir}/${monthDir}/${dateDir}`
}
...然后使用此函数代替变量:
const storage = multer.diskStorage({
destination: function (req, file, cb) {
const dirName = getDynamicDir();
if (fs.existsSync(dirName)) {
console.log('upload dir is exist')
} else {
fs.mkdirSync(dirName, {
recursive: true
})
console.log('upload dir not found, creating...')
}
cb(null, dirName)
},
其实你根本不需要这个功能:直接用moment formatting就可以了:
const dirName = moment().format('YYYY/MMMM/DD');
...因为它会做完全相同的事情。
我 API 通过快递构建。然后我尝试使用格式为 multer 创建用于存储图像的动态文件夹:'YYYY/MMMM/DD' 并将其设置为变量。
const moment = require('moment')
const multer = require('multer')
const fs = require('fs')
let x = new Date()
let yearDir = moment(x).format('YYYY')
let monthDir = moment(x).format('MMMM')
let dateDir = moment(x).format('DD')
let dynamicDir = `${yearDir}/${monthDir}/${dateDir}`
// multer storage
const storage = multer.diskStorage({
destination: function (req, file, cb) {
if (fs.existsSync(dynamicDir)) {
console.log('upload dir is exist')
} else {
fs.mkdirSync(dynamicDir, {
recursive: true
})
console.log('upload dir not found, creating...')
}
cb(null, dynamicDir)
},
filename: function (req, file, cb) {
cb(null, file.originalname)
}
})
let uploadFile = multer({
storage: storage
})
module.exports = uploadFile
但是当日期改变和图片上传时,图片的目录总是不变的。
const { Router } = require('express')
const router = Router()
const uploadCtrl = require('../controllers/upload.js')
const uploadFile = require('../config/multer.js')
router.post('/upload', uploadFile.single('image'), uploadCtrl)
export default router
能否将 new Date() 设置为变量,或者我需要在瞬间编写它们,例如:moment(new Date()).format('DD') ?
不,您实际上是在以正确的方式进行操作:如果您这样做,您的代码有(轻微)机会在日期的边缘执行:
let yearDir = moment( new Date() ).format('YYYY')
let monthDir = moment( new Date() ).format('MMMM')
您实际遇到的问题是模块的代码总是只执行一次。所有后续的导入和需求都会消耗执行的结果。这意味着 dynamicDir
的值在计算后保持不变。
面对这样的挑战,总有一个相当直接的解决方案:用函数替换变量。在这种情况下,它看起来像这样(但可以大大简化;如果您想查看如何,请向下滚动)
const getDynamicDir = () => {
let x = new Date()
let yearDir = moment(x).format('YYYY')
let monthDir = moment(x).format('MMMM')
let dateDir = moment(x).format('DD')
return `${yearDir}/${monthDir}/${dateDir}`
}
...然后使用此函数代替变量:
const storage = multer.diskStorage({
destination: function (req, file, cb) {
const dirName = getDynamicDir();
if (fs.existsSync(dirName)) {
console.log('upload dir is exist')
} else {
fs.mkdirSync(dirName, {
recursive: true
})
console.log('upload dir not found, creating...')
}
cb(null, dirName)
},
其实你根本不需要这个功能:直接用moment formatting就可以了:
const dirName = moment().format('YYYY/MMMM/DD');
...因为它会做完全相同的事情。