bao gồm tệp .js bên ngoài trong ứng dụng node.js


97

Tôi có một ứng dụng nút app.js. Vì tệp này đang bắt đầu phát triển, tôi muốn di chuyển một số phần của mã trong một số tệp khác mà tôi sẽ "yêu cầu" hoặc "bao gồm" trong tệp app.js.

Tôi đang thử những thứ như:

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

// THE FOLLOWING REQUIRE DOES NOT WORK
require('./models/car.js');

trong car.js:

// Define Car model
CarSchema = new Schema({
  brand        : String,
  type : String
});
mongoose.model('Car', CarSchema);

Tôi gặp lỗi:

ReferenceError: Schema is not defined

Tôi chỉ đang tìm cách tải nội dung của car.js (thay vì có mọi thứ trong cùng một tệp app.js) Có cách đặc biệt nào để thực hiện việc này trong node.js không?


1
Lược đồ không tồn tại trong phạm vi đó. Bạn có thể thử chuyển Schema vào car.js thông qua một số loại hàm được xuất, theo cách đó bạn có thể tham khảo nó. Điều đó hoặc yêu cầu mongoose trong car.js.
Robert

3
Node.js sử dụng CommonJS, chia mã của bạn thành các mô-đun khác nhau. Quy tắc chung, phạm vi mã trong ứng dụng Node là tệp mà nó được xác định. Vì vậy, bạn sẽ cần phải có mongoose trong car.js và trong car.js, bạn sẽ cần xuất bất kỳ thứ gì còn lại trong ứng dụng của mình sau đó nhu cầu yêu cầu nó trong tệp chính của bạn giống như bạn đang làm.
Matt Greer

Câu trả lời:


100

Việc nhấn mạnh vào những gì mọi người khác đã nói var fooở cấp cao nhất không tạo ra một biến toàn cục. Nếu bạn muốn một biến toàn cục thì hãy viết global.foo. nhưng chúng ta đều biết các quả cầu là xấu xa.

Nếu bạn là người sử dụng các hình cầu như vậy trong dự án node.js mà tôi đã tham gia, tôi sẽ cấu trúc lại chúng vì chỉ có rất ít trường hợp sử dụng cho việc này (Có một vài trường hợp ngoại lệ nhưng đây không phải là một).

// Declare application
var app = require('express').createServer();

// Declare usefull stuff for DB purposes
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;

require('./models/car.js').make(Schema, mongoose);

trong car.js

function make(Schema, mongoose) {
    // Define Car model
    CarSchema = new Schema({
      brand        : String,
      type : String
    });
    mongoose.model('Car', CarSchema);
}

module.exports.make = make;

32
Mẹo cho bất cứ ai đọc, bạn chỉ có thể làm exports.foo, chứ không phải sau đó module.exports.foo
Tyler Egeto

9
@TylerEgeto Tôi luôn cảm thấy an toàn hơn nếu sử dụng phiên bản dài hơn;)
Raynos

3
Bạn có vui lòng mở rộng ví dụ để cho thấy cách người ta có thể sử dụng các biến được định nghĩa bên trong car.js trong ứng dụng chính không? ví dụ: `function make (...) {... CarModel = mongoose.model ('Car', CarSchema); } `Bên trong ứng dụng, làm cách nào để sử dụng CarModel?
Marius

:)) Ok, còn khi thiết lập nhiều vars bên trong hàm thì sao? ví dụ: nhiều mô hình, hoặc thậm chí 3 mô hình, và 2 cái gì đó elses? Chúng có nên được trả lại như một phần của một đối tượng? ví dụreturn {models: {car: CarModel, dealer: CarDealer}, carStuff: carStuff}
Marius

56

Câu trả lời chính xác thường là sử dụng request, nhưng trong một số trường hợp thì không thể.

Đoạn mã sau sẽ thực hiện thủ thuật, nhưng hãy sử dụng nó một cách cẩn thận:

var fs = require('fs');
var vm = require('vm');
var includeInThisContext = function(path) {
    var code = fs.readFileSync(path);
    vm.runInThisContext(code, path);
}.bind(this);
includeInThisContext(__dirname+"/models/car.js");

2
Vấn đề với điều này là: "Mã đang chạy không có quyền truy cập vào phạm vi cục bộ." nodejs.org/api/vm.html#vm_vm_runinthiscontext_code_filename
Petah

Điều này là như thế #includenào?
Steven Lu

18

Câu trả lời ngắn:

// lib.js
module.exports.your_function = function () {
  // Something...
};

// app.js
require('./lib.js').your_function();

Điều này không làm việc cho tôi. Tôi đang nhận lỗi Cannot find module lib.js.
Manoj

2
@Manoj, bạn phải đặt tiền tố lib.js bằng ./ như vậy:require('./lib.js').your_function()
Chris

8

bạn có thể đặt

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

ở đầu tệp car.js của bạn để nó hoạt động hoặc bạn có thể làm những gì Raynos đã nói.


4

Nếu bạn chỉ muốn kiểm tra một thư viện từ dòng lệnh, bạn có thể làm:

cat somelibrary.js mytestfile.js | node

0

Cách tiếp cận này phù hợp với tôi trong Node.js, Có vấn đề gì với cách này không?

Tệp 'include.js':

fs = require('fs');

Tệp 'main.js':

require('./include.js');

fs.readFile('./file.json', function (err, data) {
    if (err) {
        console.log('ERROR: file.json not found...')
    } else {
        contents = JSON.parse(data)
    };
})

Cái này sai. "fs" không bao giờ được xuất! Sẽ không hoạt động trên chế độ nghiêm ngặt đó là mặc định trong ES6
MyUserInStackOverflow
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.