javascript - 当涉及到变量时,new Date() 返回相同的值
问题描述
我有通过 express 构建的 API。然后我尝试使用格式为 'YYYY/MMMM/DD' 的 multer 创建用于存储图像的动态文件夹,并将其设为变量。
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)
},
其实你甚至不需要这个功能:直接使用矩格式化:
const dirName = moment().format('YYYY/MMMM/DD');
...因为它会做完全相同的事情。
推荐阅读
- java - 无法在 Spring Boot 应用程序中刷新现有的单例 bean
- python - Python如何在列表X中搜索元素Y。元素Y本身就是一个列表,其元素可能与X中列出的顺序不同
- python - 如何在单个对象中展平 SQLAlchemy 查询的结果?
- c++ - 允许通过“位索引、大小”访问多个位的 C++ 容器类型
- ios - IOS库-检索图像中对象的区域
- javascript - Leaflet.js:将地图缩放到可见标记
- javascript - 使用聚合从 Mongo 数据库中获取最新保存
- ios - 轻按推送通知时 userNotificationCenter 未运行
- ios - UIView 没有像预期的那样模糊
- html - 在 div 中制作 100% 宽度的固定/粘性标题