Почему process.env не определен в модуле? - PullRequest
0 голосов
/ 02 июля 2019

Я новичок с 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, оно будет работать.

Ответы [ 2 ]

1 голос
/ 03 июля 2019

Я идиот.Я назвал функцию process, которая является именем системной переменной: D

Извините, что беспокою вас, ребята, спасибо за помощь.

0 голосов
/ 02 июля 2019

Добавить require ('dotenv'). Config () в глобальном.Также убедитесь, что файл .env находится в корневом каталоге проекта.Я создал образец на github https://github.com/GMaker01/basic-dotenv-example

. Для справки вы можете посмотреть документацию по dotenv

...