2012-08-23 47 views
5

Đối số của require(...) trong node.js là tên tệp. Nếu tôi có mã nguồn mô-đun trong một chuỗicode, tôi có thể gọi hàm require(code) và tải từ chuỗi đó không?Yêu cầu trong nodejs

+1

http://nodejs.org/api/modules.html#modules_modules (thật là một uri vô lý) – jAndy

+0

@jAndy Mã nguồn trong chuỗi ở đâu? Tôi chỉ thấy tải từ tệp. – Cartesius00

+0

http://nodejs.org/api/modules.html – Thomas

Trả lời

1

Công việc xung quanh có thể là viết mã nguồn mô-đun vào một tệp tạm thời ./tmp-file.js và sau đó require('./tmp-file'), sau đó xóa tệp.

Điều này có lẽ không tối ưu vì bạn sẽ phải chặn và ghi tệp một cách đồng bộ hoặc đặt tất cả mọi thứ yêu cầu mô-đun đó trong gọi lại để viết async.

Một ví dụ làm việc cho tập tin async ghi (gist - also includes sync file write):

var http = require('http'); 
var fs = require('fs'); 

var helloModuleString = "exports.world = function() { return 'Hello World\\n'; }"; 
fs.writeFile('./hello.js', helloModuleString, function (err) { 
    if (err) return console.log(err); 
    var hello = require('./hello'); 

    http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end(hello.world()); 
    }).listen(1337, '127.0.0.1'); 

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

Kết quả trong:

$ curl 127.0.0.1:1337 
> Hello World 
+0

Cảm ơn, âm thanh như một giải pháp cơ bản tốt. – Cartesius00

+0

Nói chung tôi đồng ý, nhưng điều đó đòi hỏi ứng dụng nút phải được phép tạo tệp trên hệ thống tệp. Và nếu bạn bắt đầu nhiều phiên bản của ứng dụng nút, bạn phải quyết định phải làm gì với tệp hoặc vùng tên của chúng bằng cách nào đó. Tôi đã cố gắng thêm tiện ích mở rộng tùy chỉnh nhưng hiện không còn được dùng nữa. Không có giải pháp tốt nào khác? –

2

tôi đặt này vào một chức năng để tái sử dụng. Nó tạo ra một tập tin trong thư mục temp os dựa trên một băm ngẫu nhiên, yêu cầu nó và sau đó xóa nó.

var fs  = require('fs'), 
    os  = require('os'), 
    crypto = require('crypto'); 

function requireString(moduleString) { 
    var token   = crypto.randomBytes(20).toString('hex'), 
     filename  = os.tmpdir() + '/' + token + '.js', 
     requiredModule = false; 

    // write, require, delete 
    fs.writeFileSync(filename, moduleString); 
    requiredModule = require(filename); 
    fs.unlinkSync(filename); 

    return requiredModule; 
} 

Sau đó, bạn có thể làm:

var carString = "exports.start = function(){ console.log('start'); };", 
    car  = requireString(carString); 

console.log("Car:", car); 

này vẫn còn nhiều hơn một workaround, nhưng thuận tiện hơn để sử dụng, tôi nghĩ.

+1

đẹp, cảm ơn bạn – Cartesius00

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