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');

...因为它会做完全相同的事情。