【问题标题】:Why is process.env undefined in module?为什么 process.env 在模块中未定义?
【发布时间】:2019-11-13 01:20:12
【问题描述】:

我是 nodejs 的初学者,我希望通过模块共享环境变量。我用 dotenv 包读取了这些变量。但是在下一个必需的模块中 process.env 是未定义的。

app.js

console.log(require('dotenv').config())
console.log(process.env.NODE_ENV);
require('./task')

task.js

console.log(process.env);
console.log(process.env.NODE_ENV);

.env

NODE_ENV=development
PORT=8080

控制台日志

{ parsed: { NODE_ENV: 'development', PORT: '8080' } }
development
undefined
E:\msf\nodejs_prj\compositor\task.js:2
console.log(process.env.NODE_ENV);
                        ^
TypeError: Cannot read property 'NODE_ENV' of undefined
    at Object.<anonymous> ...

我使用提供的代码创建了新的干净项目,它也适用于我。这意味着它与其他事物有关。这个 node.js 是关于错误的。

这是我在 task.js 中的全部代码

const fs = require('fs')
const path = require('path')
const decompress = require('decompress')

const dir = './upload'

console.log(process, process.env)

function process() {
    console.log('cron - process data');

    fs.readdir(dir, (err, files) => {
        if (err) return

        files.forEach(file => {
            if (path.extname(file) != '.zip') return

            let target = path.join(dir, path.basename(file).replace(path.extname(file), ''))
            unlinkDirSync(target)

            decompress(path.join(dir, file), target).then(files => {
                console.log(files);
                console.log('done!');

                //todo process unzipped files

                //todo delete unzipped directory and zip file
            })
        })
    })
}

function unlinkDirSync(dir_path) {
    if (fs.existsSync(dir_path)) {
        fs.readdirSync(dir_path).forEach(function (entry) {
            var entry_path = path.join(dir_path, entry);
            if (fs.lstatSync(entry_path).isDirectory()) {
                unlinkDirSync(entry_path);
            } else {
                fs.unlinkSync(entry_path);
            }
        });
        fs.rmdirSync(dir_path);
    }
}

if (process.env === undefined || process.env.NODE_ENV === undefined || process.env.NODE_ENV === 'production') {
    console.log('starting on production')
    setInterval(process, 1000 * 60)
} else {
    console.log('starting on development')
    setTimeout(process, 1000)
}

如果我在 console.log 之后注释掉其余部分,它会起作用。

【问题讨论】:

  • 在我的机器上运行良好,代码相同
  • 相同,无法重现问题(Ubuntu v18.04、Node v12.4、dotenv v8.0.0)
  • 您如何运行应用程序以及您使用的是哪些版本(node、dotenv)?
  • 我有 Win10,node.js v10.16.0,dotenv 8.0.0
  • process.env 永远不应未定义。 @EsooLDo 你确定你使用的整个代码都包含在问题中了吗?

标签: javascript node.js dotenv


【解决方案1】:

我是个白痴。我命名了函数进程,也就是系统变量的名字 :D

打扰了,谢谢大家的帮助。

【讨论】:

  • 哈哈,太搞笑了,我也遇到了同样的问题。只有在我将“进程”的值打印到控制台后,我才意识到我做了什么。
  • 我也是个白痴,谢谢 :) haha​​hahha 我的意思是,我正在搜索这个几乎一天。等待一个非凡的解决方案,而不是一个简单的解决方案。
【解决方案2】:

在全局中添加 require('dotenv').config()。还要确保 .env 文件位于项目的根目录中。我在github上创建了一个示例https://github.com/GMaker01/basic-dotenv-example

作为参考,您可以查看 dotenv documentation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-10
    • 2015-05-19
    • 2022-01-04
    • 2021-11-23
    • 2019-12-04
    • 2017-05-28
    • 2021-09-27
    相关资源
    最近更新 更多