NODE_ENV คืออะไรและใช้ใน Express ได้อย่างไร


184

นี่คือแอพของฉันซึ่งฉันกำลังใช้งานอยู่

var app = express();
app.set('views',settings.c.WEB_PATH + '/public/templates');
app.set('view engine','ejs');
app.configure(function(){
    app.use(express.favicon());
    app.use(express.static(settings.c.WEB_PATH + '/public'));
    app.use(express.bodyParser());
    app.use(express.cookieParser());
    app.use(express.methodOverride());
    app.use(express.session({
            cookie:{ domain:"."+settings.c.SITE_DOMAIN, maxAge:1440009999},
            secret:'hamster',
            store: r_store,
            }));
    app.use(useragent.express());
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
});

อย่างไรก็ตามฉันมารู้จักNODE_ENVและต้องการใช้มัน ฉันจะทำสิ่งนี้ได้อย่างไร


ในกรณีของคุณฉันถือว่าสิ่งที่คุณสามารถใช้คือapp.configure('development', ...)หรือ "การผลิต" เพื่อตั้งค่าบางอย่างเฉพาะสำหรับการพัฒนาหรือสภาพแวดล้อมการผลิต ดูexpressjs.com/api.html#app.configure
Andreas Hultgren

คำตอบ:


360

NODE_ENVเป็นตัวแปรสภาพแวดล้อมที่ได้รับความนิยมโดยเว็บเซิร์ฟเวอร์แบบเอ็กซ์เพรส เมื่อรันแอ็พพลิเคชันโหนดมันสามารถตรวจสอบค่าของตัวแปรสภาวะแวดล้อมและทำสิ่งต่าง ๆ ตามค่า NODE_ENVมีการใช้เป็นพิเศษ (ตามแบบแผน) เพื่อระบุว่าสภาพแวดล้อมเฉพาะเป็นการผลิตหรือสภาพแวดล้อมการพัฒนา กรณีการใช้งานทั่วไปกำลังเรียกใช้การดีบักหรือรหัสการบันทึกเพิ่มเติมหากทำงานในสภาพแวดล้อมการพัฒนา

กำลังเข้าถึง NODE_ENV

คุณสามารถใช้รหัสต่อไปนี้เพื่อเข้าถึงตัวแปรสภาพแวดล้อมด้วยตนเองเพื่อให้คุณสามารถทำการตรวจสอบและตรรกะของคุณเอง:

var environment = process.env.NODE_ENV

หรือมิฉะนั้นจะใช้ express ' app.get('env')( หมายเหตุ:ค่าเริ่มต้นนี้เป็น"development")

โปรดทราบว่าถ้าคุณยังไม่ได้กำหนดอย่างชัดเจนสำหรับสภาพแวดล้อมของคุณก็จะเป็นNODE_ENVundefined

ตั้งค่า NODE_ENV

วิธีการตั้งค่าตัวแปรสภาพแวดล้อมจริงแตกต่างจากระบบปฏิบัติการไปยังระบบปฏิบัติการและยังขึ้นอยู่กับการตั้งค่าผู้ใช้ของคุณ

หากคุณต้องการตั้งค่าตัวแปรสภาพแวดล้อมเป็นแบบครั้งเดียวคุณสามารถทำได้จากบรรทัดคำสั่ง:

  • linux & mac :export NODE_ENV=production
  • windows :$env:NODE_ENV = 'production'

ในระยะยาวคุณควรจะทำเช่นนี้เพื่อไม่ให้ unset ถ้าคุณรีบูท - แทนที่จะทำรายการวิธีที่เป็นไปได้ทั้งหมดนี้ฉันจะให้คุณค้นหาวิธีทำด้วยตัวเอง!

การประชุมได้กำหนดว่ามีเพียงสองค่าที่คุณควรใช้สำหรับNODE_ENVอย่างใดอย่างหนึ่งproductionหรือเป็นdevelopmentตัวพิมพ์เล็กทั้งหมด ไม่มีอะไรหยุดคุณเพิ่มค่ามากขึ้น แต่มันอาจไม่ใช่ความคิดที่ดีเพราะฉันเห็นโค้ดประเภทนี้มากมายในหลาย node_modules ที่ฉันใช้:

var development = process.env.NODE_ENV !== 'production';

โปรดทราบว่าเป็นความคิดที่ดีที่จะลองตั้งค่าNODE_ENVจากภายในแอปพลิเคชันของโหนดเอง - หากคุณทำจะใช้กับกระบวนการที่ตั้งค่าไว้เท่านั้นดังนั้นสิ่งต่างๆอาจไม่ทำงานอย่างที่คุณคาดหวัง อย่าทำอย่างนั้น - คุณจะเสียใจ


5
ใน Express 4 app.configure()ถูกลบแล้ว คู่มือการโยกย้ายด่วน 4แนะนำให้ใช้ " process.env.NODE_ENVหรือapp.get('env')ในการตรวจสอบสภาพแวดล้อมและการกำหนดค่าแอปตาม."
Chris Bartley

3
ฉันคิดว่ามันเป็นการดีที่สุดที่จะใช้ app.get ('env') เพราะหากสภาพแวดล้อมไม่ได้กำหนดค่าเริ่มต้นของโหนดเพื่อพัฒนาโดยที่เพียงแค่ตรวจสอบตัวแปรด้วยตัวคุณเองก็จะให้ค่าที่ไม่ได้กำหนดไว้
light24bulbs

11
จุดดี - ฉันเพิ่มบันทึกย่อเพื่อเน้นค่าเริ่มต้น อย่างไรก็ตามความรู้สึกส่วนตัวของฉันคือคุณไม่ควรใช้app.get('env')ด้วยเหตุผลนั้น มันครอบคลุมถึงว่าตัวแปรสำคัญนี้ไม่ได้ตั้งค่า - ทำให้สิ่งต่าง ๆ ดูไม่สอดคล้องกันเมื่อคุณเข้าถึงจากนอกการแสดงออก นอกจากนี้ฉันคิดว่ามันเป็นอันตรายน้อยกว่าที่จะมีรหัสการดีบักโดยไม่ตั้งใจไม่ได้ทำงานในสภาพแวดล้อมการพัฒนากว่าที่จะให้มันตั้งใจทำงานบนสภาพแวดล้อมการผลิตโดยไม่ตั้งใจ
Ed Hinchliffe

5
ฉันวัดผลจากการข้ามการตั้งค่า NODE_ENV ในแอปพลิเคชันด่วน มันเป็นค่าเริ่มต้นdevelopmentที่ - เหนือสิ่งอื่นใด - หมายความว่าแม่แบบจะถูกประมวลผลใหม่สำหรับทุกคำขอ ผลที่ตามมาคือประสิทธิภาพเพิ่มขึ้นหรือลดลงประมาณ 75% ระหว่างการผลิตและการพัฒนาเมื่อใช้ Jade ฉันยังสร้างโพสต์บล็อกในapmblog.dynatrace.com/2015/07/22/ …
DanielKhan

8
ฉันคิดว่าสำหรับโครงการด่วนนอกเหนือจาก "การผลิต" และ "การพัฒนา" อย่างน้อยคุณก็ต้องการ "การทดสอบ" อีกหนึ่งอย่างสำหรับการทดสอบอัตโนมัติ คุณอาจต้องการใช้ฐานข้อมูลอื่นสำหรับข้อมูลการทดสอบที่มีประชากร
dawnstar

19

NODE_ENVเป็นตัวแปรสภาพแวดล้อมที่หมายถึงสภาพแวดล้อมของโหนดในเซิร์ฟเวอร์ด่วน

มันเป็นวิธีที่เราตั้งค่าและตรวจสอบสภาพแวดล้อมที่เราอยู่

มันเป็นเรื่องธรรมดามากที่ใช้และproductiondevelopment

ตั้ง:

export NODE_ENV=production

จะได้รับ:

คุณสามารถใช้มันได้ app.get('env')


11

ฉันคิดว่าคำถามเดิมรวมถึงวิธีการที่ Express ใช้ตัวแปรสภาพแวดล้อมนี้

Express ใช้ NODE_ENV เพื่อแก้ไขพฤติกรรมเริ่มต้นของตัวเอง ตัวอย่างเช่นในโหมดการพัฒนาตัวจัดการข้อผิดพลาดที่เป็นค่าเริ่มต้นจะส่งสแต็คเทรซกลับไปที่เบราว์เซอร์ ในโหมดการผลิตการตอบสนองเป็นเพียงInternal Server Errorเพื่อหลีกเลี่ยงการรั่วไหลของรายละเอียดการดำเนินการไปทั่วโลก


0

โดยปกติแล้วคุณจะใช้NODE_ENVตัวแปรเพื่อดำเนินการพิเศษเมื่อคุณพัฒนาทดสอบและแก้ไขข้อบกพร่องของรหัส ตัวอย่างเช่นการสร้างรายละเอียดการบันทึกและดีบักเอาต์พุตที่คุณไม่ต้องการในการผลิต การแสดงออกของตัวเองจะทำงานแตกต่างกันไปขึ้นอยู่กับว่าNODE_ENVมีการตั้งค่าproductionหรือไม่ คุณสามารถเห็นสิ่งนี้หากคุณใส่บรรทัดเหล่านี้ในแอป Express จากนั้นทำการร้องขอ HTTP GET ไปที่/error:

app.get('/error', function(req, res) {
  if ('production' !== app.get('env')) {
    console.log("Forcing an error!");
  }
  throw new Error('TestError');
});

app.use(function (req, res, next) {
  res.status(501).send("Error!")
})

โปรดทราบว่าหลังapp.use()จะต้องมีอายุหลังจากตัวจัดการวิธีการอื่น ๆ ทั้งหมด!

หากคุณตั้งNODE_ENVไปproductionก่อนที่คุณจะเริ่มต้นเซิร์ฟเวอร์ของคุณแล้วส่งGET /errorคำขอไปคุณไม่ควรจะเห็นข้อความForcing an error!ในคอนโซลและการตอบสนองไม่ควรมีกองติดตามในร่างกาย HTML (ซึ่งต้นกำเนิดจากเอ็กซ์เพรส) หากคุณตั้งค่าNODE_ENVเป็นอย่างอื่นก่อนที่จะเริ่มเซิร์ฟเวอร์ของคุณสิ่งที่ตรงกันข้ามควรเกิดขึ้น

ใน Linux ให้ตั้งค่าตัวแปรสภาพแวดล้อม NODE_ENV ดังนี้

ส่งออก NODE_ENV = ' ค่า '

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.