2015-02-27 11 views
6

Trong xây dựng dự án Node.js với LoopbackJS, tôi cần lưu trữ dữ liệu trong khi yêu cầu.Node.js process.domain đôi khi không được xác định

Vì vậy, tôi sử dụng domain tính năng:

// pre-processing middleware 
app.use(function (req, res, next) { 
    // create per request domain instance 
    var domain = require('domain').create(); 

    // save request and response to domain, to make it accessible everywhere 
    domain.req = req; 
    domain.res = res; 
    domain.run(next); 
}); 

Sau đó trong mô-đun cần thiết:

Model.beforeRemote('**', function(oContext, oModel, next) { 
    // Save method name for later use 
    process.domain.remoteContext = {   /* Here is an error thrown */ 
     methodName: oContext.method.name 
    }; 
    ... 
    process.domain.res.send() // example of usage 
}) 

NHƯNG khi tôi thực hiện theo yêu cầu từ Safari hoặc IE, process.domain là đôi khi không xác định! Yêu cầu từ Chrome hoặc Firefox hoạt động như mong đợi. Bất kỳ đề xuất?

Lỗi phản ứng:

{"error":{"name":"TypeError","status":500,"message":"Cannot set property 'remoteContext' of undefined","stack":"TypeError: Cannot set property 'remoteContext' of undefined\n at module.exports (/Users/igormatyushkin/projects/Yash/server/hooks/admin-remote.js:12:34)\n at Function.Model.setup.ModelCtor.beforeRemote.args (/Users/igormatyushkin/projects/Yash/node_modules/loopback/lib/model.js:184:9)\n at execStack (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/lib/remote-objects.js:363:13)\n at RemoteObjects.execHooks (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/lib/remote-objects.js:372:10)\n at RemoteObjects.invokeMethodInContext (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/lib/remote-objects.js:512:8)\n at async.series.results (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:610:21)\n at _asyncMap (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:249:17)\n at async.eachSeries.iterate (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:149:13)\n at async.eachSeries (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:165:9)\n at _asyncMap (/Users/igormatyushkin/projects/Yash/node_modules/loopback/node_modules/strong-remoting/node_modules/async/lib/async.js:248:13)"}} 
+0

Bạn có thể hiển thị cho chúng tôi mã nơi miền không xác định không? Bạn có đang truy cập miền từ cùng phạm vi nơi bạn đã xác định không? Trong ví dụ mã của bạn, bạn không thực sự gắn miền vào tiến trình - tôi cho rằng bạn làm điều đó ở một nơi khác trong mã của bạn?Ngoài ra, vui lòng đăng theo dõi ngăn xếp dẫn đến lỗi không xác định, nó có thể chứa một hoặc hai đầu mối. –

+0

@RobertRossmann, tôi đã cập nhật mã và thêm lỗi được thêm vào. 'Process.domain' được khởi tạo bởi nút, khi' domain.run() 'được gọi và tôi truy cập' process.domain.remoteContext 'sau trong các mô-đun cần thiết khác. – IvanZh

Trả lời

2

Chỉ cần phát hiện ra, đó req ràng buộc ràng buộc và res để tên miền tại thời điểm tạo ra, giải quyết các tên miền không xác định xuống trong thực hiện ngăn xếp.

app.use(function (req, res, next) { 
    // create per request domain instance 
    domain.create().run(function() { 
    // explicit binding 
    process.domain.add(req) 
    process.domain.add(res) 
    // save request to domain, to make it accessible everywhere 
    process.domain.req = req; 
    process.domain.res = res; 
    next() 
    }); 
}); 

Không biết tại sao điều này xảy ra, vì vậy tôi để lại câu hỏi mở cho các lời khuyên khác có thể.

1

Điều đáng nói rằng các tên miền are not meant to be used to handle errors in this manner. Thay vào đó, tên miền được sử dụng để cho phép các mô-đun của toàn bộ ứng dụng gặp sự cố một cách an toàn (ví dụ: có thể bạn muốn chạy mã của bên thứ ba trong hộp cát). Miền không cần thiết ở đây (mặc dù bạn đang sử dụng một miền), tuy nhiên, bạn có thể sử dụng một tên miền miễn phí

Ngoài ra, process.domain chỉ được đặt nếu chức năng đã cho đang thực hiện từ trong ngăn miền. Bạn không cung cấp thông tin về trang web cuộc gọi của Mô hình, vì vậy tôi chỉ có thể giả định rằng mô hình của bạn đang được gọi từ bên ngoài ngăn xếp này, điều này gây ra lỗi.

Cho rằng bạn đang hooking để beforeRemote, mà thực hiện trước một hành động từ xa được thực thi, tôi sẽ cho rằng đã được gọi từ bên ngoài của chồng miền, và do đó process.domain được undefined dự kiến ​​hành vi.

+0

Giả sử rằng process.domain bị thiếu trong ngăn xếp cuộc gọi, nhưng nó chỉ xảy ra khi tôi yêu cầu từ Safari hoặc IE. Yêu cầu từ Chrome hoặc Firefox hoạt động như mong đợi. – IvanZh

+0

Nó không được đề cập trong câu hỏi của bạn mà bạn đã thử với Chrome hoặc Firefox, đó là lý do tại sao tôi đã đưa ra giả định - chỉ rằng bạn đã thử nó trong Safari và IE. –

1

Điều quan trọng đối với người đọc câu hỏi này là phải biết rằng Node's Domain module không được dùng nữa và không nên sử dụng.

Nếu bạn đến đây tìm kiếm giải pháp cho vấn đề này thì bạn sẽ tốt hơn khi tìm kiếm một thứ khác ngoài mô-đun Miền.

Mô-đun này đang chờ xử lý. Khi API thay thế đã được hoàn tất, mô-đun này sẽ không được dùng nữa. Hầu hết người dùng cuối không nên có nguyên nhân để sử dụng mô-đun này. Người dùng hoàn toàn phải có chức năng mà các tên miền cung cấp có thể dựa vào nó trong thời gian tới nhưng nên mong đợi phải di chuyển sang một giải pháp khác trong tương lai.

Mặc dù điều này không trả lời về mặt kỹ thuật câu hỏi của OP Tôi tin rằng đó là "giải pháp" chính xác cho hầu hết người đọc của câu hỏi này.

Cách thay thế cho việc sử dụng Miền là mô-đun continuation-local-storage.

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