2017-02-27 20 views
10

Tôi đã hai ứng dụng nút/dịch vụ đang chạy với nhau, 1. ứng dụng chính 2. ứng dụng thứ haiLàm thế nào để tiêm mô-đun từ ứng dụng khác nhau trong Node.js

Các ứng dụng chính là trách nhiệm để hiển thị tất cả các dữ liệu từ các ứng dụng khác nhau ở cuối. Bây giờ tôi đặt một số mã của ứng dụng thứ hai trong ứng dụng chính và bây giờ nó đang hoạt động, nhưng tôi muốn nó được tách riêng. Tôi có nghĩa là mã của ứng dụng secnod sẽ không có trong ứng dụng chính (bằng cách nào đó để tiêm nó vào thời gian chạy)

như dịch vụ thứ hai được đăng ký vào ứng dụng chính trong việc tiêm mã của nó. mã của nó chỉ là hai mô-đun, là nó có thể làm điều đó trong nodejs?

const Socket = require('socket.io-client'); 
const client = require("./config.json"); 

module.exports = (serviceRegistry, wsSocket) =>{ 
    var ws = null; 
    var consumer =() => { 
     var registration = serviceRegistry.get("tweets"); 
     console.log("Service: " + registration); 
     //Check if service is online 
     if (registration === null) { 
      if (ws != null) { 
       ws.close(); 
       ws = null; 
       console.log("Closed websocket"); 
      } 
      return 
     } 
     var clientName = `ws://localhost:${registration.port}/` 
     if (client.hosted) { 
      clientName = `ws://${client.client}/`; 
     } 
     //Create a websocket to communicate with the client 
     if (ws == null) { 
      console.log("Created"); 
      ws = Socket(clientName, { 
       reconnect: false 
      }); 
      ws.on('connect',() => { 
       console.log("second service is connected"); 
      }); 
      ws.on('tweet', function (data) { 
       wsSocket.emit('tweet', data); 
      }); 
      ws.on('disconnect',() => { 
       console.log("Disconnected from blog-twitter") 
      }); 
      ws.on('error', (err) => { 
       console.log("Error connecting socket: " + err); 
      }); 
     } 
    } 
    //Check service availability 
    setInterval(consumer, 20 * 1000); 
} 

Trong mô-đun chính, tôi đặt mã này và tôi muốn tách nó bằng cách tiêm nó bằng cách nào đó trên thời gian chạy? ví dụ sẽ rất hữu ích ...

+0

Tại sao không xuất ứng dụng thứ hai làm mô-đun, bạn có thể nhập ứng dụng thứ hai vào ứng dụng chính của mình. – Xlee

+0

_ "bằng cách nào đó để tiêm nó vào thời gian chạy" _. Nó được gọi là 'require()'. – robertklep

+0

Bạn có thể làm rõ lý do của bạn cho việc này không? Như đã đề cập trong một số câu trả lời tách là cách để thực hiện điều này. Trừ khi bạn có một lý do mạnh mẽ để làm điều này, tôi sẽ nói bạn nên đi với một thứ gì đó được tách rời - dịch vụ vi mô, pub/sub, hàng đợi công việc hoặc thậm chí chỉ ghi lại dữ liệu để tiêu thụ bởi một phóng viên. – Brian

Trả lời

4

Bạn sẽ phải sử dụng vm module để đạt được điều này. Thông tin kỹ thuật khác tại đây https://nodejs.org/api/vm.html. Hãy để tôi giải thích cách bạn có thể sử dụng điều này:

  1. Bạn có thể sử dụng API vm.script để tạo mã js đã biên dịch từ mã bạn muốn chạy sau này. Xem mô tả từ tài liệu chính thức

Tạo mã đối tượng vm.Script mới biên dịch nhưng không chạy. biên dịch vm.Script có thể chạy sau nhiều lần. Điều quan trọng là lưu ý rằng mã không bị ràng buộc với bất kỳ đối tượng chung nào; thay vào đó, nó là bị ràng buộc trước mỗi lần chạy, chỉ cho lần chạy đó.

  1. Bây giờ khi bạn muốn chèn hoặc chạy mã này, bạn có thể sử dụng script.runInContext API.

Một ví dụ điển hình từ các tài liệu chính thức của họ:

'use strict'; 
const vm = require('vm'); 

let code = 
`(function(require) { 

    const http = require('http'); 

    http.createServer((request, response) => { 
    response.writeHead(200, {'Content-Type': 'text/plain'}); 
    response.end('Hello World\\n'); 
    }).listen(8124); 

    console.log('Server running at http://127.0.0.1:8124/'); 
})`; 

vm.runInThisContext(code)(require); 

Một ví dụ khác của việc sử dụng js tập tin trực tiếp:

var app = fs.readFileSync(__dirname + '/' + 'app.js'); 
vm.runInThisContext(app); 

Bạn có thể sử dụng phương pháp này cho các mã có điều kiện mà bạn muốn chèn .

5

Bạn có thể tạo gói từ một trong các ứng dụng của mình và sau đó tham chiếu gói trong ứng dụng khác.

https://docs.npmjs.com/getting-started/creating-node-modules

+0

Cảm ơn nhưng nó nên được tách rời, ở đây bạn nên đặt nó với yêu cầu .... –

+0

Điều này không đơn giản như bạn nghĩ ... :) –

+0

Tôi đồng ý, không dễ dàng. Nhưng tách là tốt. – paqash

2

Có một số cách để tách riêng hai ứng dụng. Một cách dễ dàng là với pub/sub mẫu (trong trường hợp bạn không cần phản hồi).
(Bây giờ nếu bạn có một ứng dụng rất ít, sẽ rất khó tách rời nó trừ khi bạn thực hiện tái cấu trúc.)
zeromq cung cấp triển khai rất tốt.
ví dụ:

import zmq from "zmq"; 
socket.connect('tcp://127.0.0.1:5545'); 
socket.subscribe('sendConfirmation'); 

socket.on('message', function (topic, message) { 
    // you can get the data from message. 
    // something like: 
    const msg = message.toString('ascii'); 
    const data = JSON.parse(msg); 
    // do some actions. 
    // ..... 

}); 

//don't forget to close the socket. 
process.on('SIGINT',() => { 
    debug("... closing the socket ...."); 
    socket.close(); 
    process.exit(); 
}); 

//----------------------------------------- 
import zmq from "zmq"; 
socket.bind('tcp://127.0.0.1:5545'); 
socket.send(['sendConfirmation', someData]); 

process.on('SIGINT', function() { 
    socket.close(); 
}); 

Bằng cách này bạn có thể có hai container khác nhau (Docker) cho module của bạn, chỉ cần chắc chắn để mở cổng tương ứng.
Những gì tôi không hiểu, là lý do tại sao bạn tiêm wsSocket và bạn cũng tạo một Ổ cắm mới. Có lẽ những gì tôi sẽ làm chỉ là gửi ổ cắm id, và sau đó chỉ cần sử dụng nó như:

const _socketId = "/#" + data.socketId;  
io.sockets.connected[socketId].send("some message"); 

Bạn cũng có thể sử dụng một giải pháp như Kafka thay vì zmq, chỉ cần xem xét đó là chậm nhưng nó sẽ giữ các bản ghi.
Hy vọng điều này có thể giúp bạn biết cách giải quyết vấn đề của mình.

2

Bạn có thể sử dụng tính năng liên kết npm.

Quá trình liên kết bao gồm hai bước sau:

  1. Tuyên bố một module như một liên kết toàn cầu bằng cách chạy link NPM trong thư mục gốc của mô-đun
  2. Cài đặt các module liên kết trong mô-đun mục tiêu của bạn (ứng dụng) bằng cách chạy liên kết npm trong thư mục đích

Điều này hoạt động khá tốt trừ khi một trong các mô-đun cục bộ của bạn phụ thuộc vào mô-đun cục bộ khác. Trong trường hợp này, liên kết không thành công vì nó không thể tìm thấy mô đun phụ thuộc. Để giải quyết vấn đề này, một trong những nhu cầu để liên kết các mô-đun phụ thuộc vào mô-đun phụ huynh và sau đó cài đặt các phụ huynh vào ứng dụng.

https://docs.npmjs.com/cli/link

Các vấn đề liên quan