首页 > 解决方案 > 当涉及到变量时,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') ?

标签: javascriptapimomentjs

解决方案


不,您实际上是在以正确的方式进行操作:如果您这样做,您的代码很有可能会在日期的边缘执行:

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

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


推荐阅读