2010-05-28 12 views
53

Tôi đang cố gắng thiết lập máy chủ nodejs của riêng mình, nhưng tôi đang gặp sự cố. Tôi không thể tìm ra cách để xem các thay đổi đối với ứng dụng của mình mà không cần khởi động lại nó. Có cách nào để chỉnh sửa ứng dụng và xem các thay đổi trực tiếp với node.js không?Làm cách nào tôi có thể chỉnh sửa trên các tệp máy chủ của mình mà không cần khởi động lại nodej khi tôi muốn xem các thay đổi?

+0

Một kịch bản tốt hơn là sử dụng hai máy chủ như proxy, proxy server rơi xuống thứ yếu được xử lý bởi nginx khi người đầu tiên được ẩn (504error) (với nginx bạn có thể chỉnh sửa cấu hình với tải lại/không khởi động lại), theo cách này tất cả các yêu cầu được chuyển sang máy chủ thứ cấp sau khi dừng máy chủ đầu tiên, máy chủ thứ hai được sử dụng làm bản sao lưu để cập nhật tệp tại máy chủ đầu tiên. Khi lần đầu tiên trở lại nginx trực tuyến sẽ chuyển sang máy chủ đầu tiên. Với giải pháp này, bạn không mất bất kỳ yêu cầu nào. – diti

Trả lời

47

Khám phá Node-Supervisor. Bạn có thể cung cấp cho nó một bộ sưu tập các tập tin để xem các thay đổi, và nó khởi động lại máy chủ của bạn nếu có bất kỳ thay đổi nào. Nó cũng khởi động lại nó nếu nó bị treo vì một số lý do khác.

Mã "Hoán đổi nóng" không được kích hoạt trong NodeJS vì rất dễ vô tình bị rò rỉ bộ nhớ hoặc nhiều bản sao của các đối tượng không bị thu gom rác. Node là về làm cho các chương trình của bạn vô tình nhanh chóng, không vô tình bị rò rỉ.

EDIT, 7 năm sau khi thực tế: Tuyên bố từ chối trách nhiệm, tôi đã viết giám sát nút, nhưng đã giao dự án cho người bảo trì khác trước khi viết câu trả lời này.

+0

Điều đó thật tuyệt vời. – PixMach

+2

nó sẽ là tốt để trao đổi nóng trong phát triển, sau khi khởi động lại máy chủ nó sẽ được OK, đó không phải để nói nó sẽ được dễ dàng để thực hiện –

+0

Liên kết bạn đã cung cấp dường như cho thấy rằng đây là dự án của bạn. Bạn có thể làm rõ sự tham gia của mình và thêm tuyên bố từ chối trách nhiệm thích hợp (nếu thích hợp) không? – HPierce

58

nốt là một bộ nạp mô-đun cho Node để xử lý tự động tải lại các module mà không khởi động lại máy chủ (vì đó là những gì bạn đã hỏi về):

http://github.com/kriszyp/nodules

nốt không phụ thuộc thông minh theo dõi quá các nhà máy mô-đun thích hợp được thực hiện lại để duy trì các tham chiếu chính xác khi các mô-đun được tải lại mà không yêu cầu khởi động lại đầy đủ.

+0

whoa một câu trả lời thực tế cho OP! upvoted –

+0

@Kris Zyp nó là một giải pháp tuyệt vời nhưng nó vẫn tích cực duy trì? –

8

Sử dụng này: https://github.com/remy/nodemon

Chỉ cần chạy ứng dụng của bạn như thế này: nodemon yourApp.js

+5

Nodemon khởi động lại máy chủ mọi lúc và chỉ có nghĩa là được sử dụng để phát triển. Hoàn toàn trái ngược với những gì Robert đang hỏi! :) –

+1

@jasdeepkhalsa câu trả lời được chấp nhận cũng cho thấy rằng nó khởi động lại máy chủ. – Loolooii

+0

yep và câu trả lời được chấp nhận là câu trả lời sai cho OP :) –

3

gì “Sống Mã hóa”?

Về bản chất, đó là cách để thay đổi chương trình trong khi nó chạy, mà không cần khởi động lại nó. Mục tiêu, tuy nhiên, là kết thúc với một chương trình mà hoạt động đúng khi chúng tôi bắt đầu lại. Để hữu ích, nó giúp có trình chỉnh sửa có thể được tùy chỉnh để gửi mã tới máy chủ.

Hãy xem: http://lisperator.net/blog/livenode-live-code-your-nodejs-application/

3

Nên có một số tập trung vào những gì đang xảy ra, thay vì chỉ shotgunning module tại OP. Ngoài ra, chúng tôi không biết rằng các tệp mà anh ấy đang chỉnh sửa là tất cả các mô-đun JS hoặc tất cả chúng đều sử dụng cuộc gọi "yêu cầu". Thực hiện các kịch bản sau đây với một hạt muối, chúng chỉ có nghĩa là để mô tả những gì đang xảy ra để bạn biết cách làm việc với nó.

  1. Mã của bạn đã được nạp và máy chủ đang chạy với nó

    • SOLUTION Bạn cần phải có một cách để nói với máy chủ gì mã đã thay đổi để nó có thể tải lại nó . Bạn có thể có một thiết bị đầu cuối được thiết lập để nhận tín hiệu, lệnh trên dòng lệnh hoặc yêu cầu thông qua tcp/http sẽ cho biết tệp nào đã thay đổi và điểm cuối sẽ tải lại nó.

      //using Express 
      var fs = require('fs'); 
      app.get('reload/:file', function (req, res) { 
          fs.readfile(req.params.file, function (err, buffer) { 
           //do stuff... 
          }); 
      }); 
      
  2. Mã của bạn có thể có "yêu cầu" các cuộc gọi trong nó mà tải và nới lưu trữ module

    • SOLUTION vì những module được lưu trữ bởi yêu cầu, sau khi giải pháp trước , bạn sẽ cần một dòng trong điểm cuối để xóa tham chiếu đó

      var moduleName = req.params.file; 
      delete require.cache[moduleName]; 
      require('./' + moduleName); 
      

Có rất nhiều số khó khăn để có được vào đằng sau tất cả những điều này, nhưng hy vọng bạn có một ý tưởng tốt hơn về những gì đang xảy ra và tại sao.

3

nếu bạn muốn tải lại một mô-đun mà không cần khởi động lại quá trình nút, bạn có thể làm điều này bằng sự giúp đỡ của các watchFile chức năng trong fs mô-đun và bộ nhớ cache thanh toán bù trừ tính năng của yêu cầu:

phép nói rằng bạn nạp một mô-đun với một đơn giản yêu cầu:

var my_module = require('./my_module'); 

Để xem tệp đó và tải lại khi cập nhật, hãy thêm thông tin sau vào vị trí thuận tiện trong mã của bạn.

fs.watchFile(require.resolve('./my_module'), function() { 
    console.log("Module changed, reloading..."); 
    delete require.cache[require.resolve('./my_module')] 
    my_module = require('./my_module'); 
}); 

Nếu mô-đun của bạn là cần thiết trong nhiều file hoạt động này sẽ không ảnh hưởng đến nhiệm vụ khác, vì vậy việc giữ mô-đun trong một biến toàn cầu và sử dụng nó, nơi nó là cần thiết từ toàn cầu chứ không phải là đòi hỏi nhiều lần là một lựa chọn. Vì vậy, mã ở trên sẽ như sau:

global.my_module = require ('./my_module'); 
//.. 
fs.watchFile(require.resolve('./my_module'), function() { 
    console.log("Module changed, reloading..."); 
    delete require.cache[require.resolve('./my_module')] 
    global.my_module = require('./my_module'); 
}); 
0

Một giải pháp trực tiếp đơn giản với tài liệu tham khảo cho tất cả các câu trả lời có sẵn ở đây:

tài liệu Node nói rằng fs.watch là hiệu quả hơn fs.watchFile & nó có thể xem toàn bộ thư mục.

(tôi chỉ mới bắt đầu sử dụng này, vì vậy không thực sự chắc chắn cho dù có bất kỳ hạn chế)

fs.watch("lib", (event_type, file_name) => { 
    console.log("Deleting Require cache for " + file_name); 
    delete require.cache[ require.resolve("./lib/" + file_name)]; 
}); 
Các vấn đề liên quan