Tôi đã xem qua một đoạn mã Mongoose bao gồm một truy vấn findOne và sau đó là một hàm executive ().
Tôi chưa bao giờ thấy phương pháp đó trong Javascript trước đây? Làm gì chính xác?
Tôi đã xem qua một đoạn mã Mongoose bao gồm một truy vấn findOne và sau đó là một hàm executive ().
Tôi chưa bao giờ thấy phương pháp đó trong Javascript trước đây? Làm gì chính xác?
Câu trả lời:
Về cơ bản khi sử dụng mongoose, các tài liệu có thể được truy xuất bằng cách sử dụng trình trợ giúp. Mọi phương thức mô hình chấp nhận điều kiện truy vấn đều có thể được thực thi bằng phương thức a callback
hoặc exec
phương thức.
callback
:
User.findOne({ name: 'daniel' }, function (err, user) {
//
});
exec
:
User
.findOne({ name: 'daniel' })
.exec(function (err, user) {
//
});
Do đó, khi bạn không chuyển một lệnh gọi lại, bạn có thể tạo một truy vấn và cuối cùng thực thi nó.
Bạn có thể tìm thêm thông tin trong tài liệu mongoose .
CẬP NHẬT
Một điều cần lưu ý khi sử dụng Promises kết hợp với các hoạt động không đồng bộ của Mongoose là các truy vấn Mongoose không phải là Promise. Các truy vấn trả về giá trị có thể , nhưng nếu bạn cần một Lời hứa thực sự, bạn nên sử dụng exec
phương thức này. Thông tin thêm có thể được tìm thấy ở đây .
Trong quá trình cập nhật, tôi nhận thấy rằng tôi đã không trả lời rõ ràng câu hỏi:
Tôi chưa bao giờ thấy phương pháp đó trong Javascript trước đây? Làm gì chính xác?
Nó không phải là một phương pháp JavaScript gốc, mà là một phần của API Mongoose.
exec
phương thức. Đây là những gì họ làm trong tài liệu ít nhất. Để chắc chắn bạn có thể kiểm tra chính mình với Model.find() instanceof require('bluebird')
. Hi vọng điêu nay co ich.
Model.update().exec()
đảm bảo rằng nó sẽ thực thi. Sau đó, bạn có thể trả lời api mà không cần chờ cập nhật.
Daniel đã trả lời điều này khá đẹp. Để xây dựng danh sách đầy đủ các cách tạo và thực thi truy vấn, hãy xem các trường hợp sử dụng sau:
Tòa nhà truy vấn
Mongoose sẽ không thực hiện một truy vấn cho đến khi then
hoặc exec
đã được gọi đến. Điều này rất hữu ích khi xây dựng các truy vấn phức tạp. Một số ví dụ có thể bao gồm việc sử dụng các hàm populate
và aggregate
.
User.find({name: 'John'}) // Will not execute
Thực thi thông qua gọi lại
Mặc dù nhiều người không thích do tính chất lồng vào nhau, các truy vấn có thể được thực thi bằng cách cung cấp lệnh gọi lại tùy chọn.
User.find({name: 'John'}, (err, res) => {}) // Will execute
Sau đó, API như một lời hứa / A +
Các truy vấn Mongoose cung cấp một then
chức năng. Không nên nhầm lẫn điều này với những lời hứa thông thường. Nói một cách đơn giản, đặc tả Promises / A + yêu cầu một then
hàm hoạt động giống như cách chúng ta đã quen với các lời hứa.
User.find({name: 'John'}).then(); // Will execute
Promise.all([User.find({name: 'John'}), User.find({name: 'Bob'})]) // Will execute all queries in parallel
Hàm thực thi
Từ tài liệu của Mongoose If you need a fully-fledged promise, use the .exec() function.
User.find({name: 'John'}).exec(); // Will execute returning a promise
then
trên một truy vấn để trả về một lời hứa. Điều này không khác nhiều so với exec
. Trường hợp sử dụng tôi thấy tiện dụng này là khi sử dụng một cái gì đó như Promise.all
. Tuy nhiên, không chắc liệu lời hứa trả về có exec
hoạt động trong những bối cảnh như vậy hay không.
exec()
sẽ trả lại một lời hứa nếu không có cuộc gọi lại nào được cung cấp. Vì vậy, mẫu sau rất tiện lợi và chung chung - nó có thể xử lý các lệnh gọi lại hoặc lời hứa một cách độc đáo:
function findAll(query, populate, cb) {
let q = Response.find(query);
if (populate && populate.length > 0) {
q = q.populate(populate);
}
// cb is optional, will return promise if cb == null
return q.lean().exec(cb);
}
Tôi khuyên bạn nên sử dụng lời hứa của Bluebird với Mongoose, để làm điều đó, hãy sử dụng lệnh gọi này:
const mongoose = require('mongoose');
mongoose.Promise = require('bluebird');