为什么模块中的process.env是undefined?

8

我是一个初学者,想在使用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之后的其他内容,它就可以工作了。

它在我的电脑上运行良好,代码相同。 - rajesh-nitc
相同,无法重现该问题(Ubuntu v18.04,Node v12.4,dotenv v8.0.0) - Nino Filiu
你是如何运行应用程序的?你使用哪些版本(node,dotenv)? - RidgeA
process.env 永远不应该是未定义的。@EsooLDo 你确定你使用的整个代码已经包含在问题中了吗? - Nino Filiu
@ShubhamSharma 听起来不错。我们能做些什么呢? - oLDo
显示剩余4条评论
2个回答

21

我真蠢,把一个系统变量的名字叫做 process,结果和函数名重复了 :D

不好意思打扰大家了,感谢帮助。


哈哈,太有趣了,我刚好遇到了同样的问题。只有当我将“process”的值打印到控制台时,我才意识到自己做错了什么。 - Dylan Nicholson
我也是个傻瓜,谢谢 :) 哈哈哈哈,我的意思是,我已经搜索了将近一天了,等待一个非凡的解决方案,而你却提供了一个简单的解决方案。 - Felipe Fernandes

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接