MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tại sao tôi nhận được Không thể đặt tiêu đề sau khi chúng được gửi đến lỗi máy khách trong Nodejs?

Ngay tại đây:

Post.find({}, function(err, docs) {
    if (docs.length == 0)
        return res.send({ message: "No posts" });

Nếu bạn đạt đến điều kiện docs.length == 0 đó , sau đó bạn sẽ gửi phản hồi cho yêu cầu. Tuy nhiên, return của bạn CHỈ trả về từ Post.find() gọi lại. Nó không quay trở lại từ trendingposts() của bạn chức năng.

Vì vậy, trong khi đó, hàm đó tiếp tục thực thi và cuối cùng đi đến mã này:

var mysort = { score: -1 };
Post.find({})
    .populate("postedBy")
    .populate("comments.postedBy")
    .populate("comments.incomments.postedBy")
    .populate("comments.likes")
    .sort(mysort)
    .limit(10)
    .exec((er, result) => {

        res.json(result);
    });

Sau đó, nơi bạn gửi một phản hồi khác cho cùng một yêu cầu. Đó là nguyên nhân gây ra lỗi Cannot set headers after they are sent to the client mà bạn thấy.

Có nhiều cách khác nhau để ngăn chặn điều này, nhưng chúng có lẽ đều liên quan đến cách bạn thường dọn dẹp chức năng này. Theo cách nó được viết bây giờ, về cơ bản bạn bắt đầu hai đường dẫn mã không đồng bộ hoàn toàn riêng biệt. Cả hai đều bắt đầu bằng Post.find({}) và đi từ đó. Chúng chạy song song và không có bất kỳ ý tưởng nào về những gì đường dẫn mã khác đang làm. Do đó, bạn không có cách nào cụ thể để gửi phản hồi từ một, nhưng không phải cả hai.

Vì vậy, cách để làm sạch điều này có lẽ là không có hai đường dẫn mã không đồng bộ hoàn toàn riêng biệt. Bạn cần phối hợp chúng theo một cách nào đó. Trong hầu hết các trường hợp ở đây, bạn sẽ muốn chuyển sang giao diện hứa hẹn cho cơ sở dữ liệu của mình vì điều đó sẽ cung cấp cho bạn nhiều tùy chọn hơn để quản lý luồng điều khiển của mình. Ví dụ:nếu vì lý do hiệu suất, bạn muốn có hai hoạt động không đồng bộ song song diễn ra cùng một lúc, với các hứa hẹn, bạn có thể sử dụng Promise.all() hoặc Promise.allSettled() để theo dõi cả hai và biết khi nào chúng được thực hiện và sau đó, với cả hai kết quả trong tay, hãy quyết định gửi phản hồi nào.

Hoặc, nếu bạn muốn sắp xếp chúng, bạn có thể sử dụng async/await khá dễ dàng trình tự hai thao tác và sau đó khi bạn thực hiện return , nó sẽ thực sự trở lại từ chức năng cấp cao nhất và sẽ ngừng luồng điều khiển tiếp theo.

Nếu bạn muốn gắn với giao diện gọi lại với cơ sở dữ liệu của mình, thì bạn có thể sẽ phải lồng thao tác thứ hai vào tùy chọn đầu tiên để bạn không bắt đầu thao tác thứ hai nếu bạn định thực hiện res.send({ message: "No posts" }) .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Không thể nâng cấp mongoDB đã phân đoạn hoặc dừng trình cân bằng

  2. $ unwind mảng trống

  3. Làm cách nào để sử dụng truy vấn không gian địa lý trong trình điều khiển 2.1 MongoDB C #?

  4. Phiên Django

  5. loại bỏ _id khỏi kết quả mongo