簡體   English   中英

為什么我的 mongoose 排序方法不起作用?

[英]Why isn't my mongoose sort method working?

好的。 所以。 我有一個非常基本的 API 在 Node.js 上運行。 我還使用 MongoDB 作為數據庫,我使用 Mongoose 來構建查詢。 我的問題是我正在嘗試使用 mongoose 'sort' 方法查詢排序的數據列表。 由於某種原因,該方法不起作用,Node 嘗試改用 Javascript 排序方法。 這是我的代碼:

查詢處理:

const mongoose = require("mongoose");
const express = require("express");
const Tour = require("../models/tourModel.js");

exports.getAllTours = async (req, res) => {
  try {
    // eslint-disable-next-line node/no-unsupported-features/es-syntax
    const queryObject = { ...req.query };
    const excludedFields = ["page", "sort", "limit", "fields"];
    excludedFields.forEach((el) => delete queryObject[el]);

    let queryStr = JSON.stringify(queryObject);
    queryStr = queryStr.replace(/\b(gte|gt|lte|lt)\b/g, (match) => `$${match}`);

    let query = await Tour.find(JSON.parse(queryStr));

    // query.sort((a, b) => (a[req.query.sort] > b[req.query.sort] ? 1 : -1));
    if (req.query.sort) {
      query = query.sort(req.query.sort);
    }

    const tours = await query;

    res.status(200).json({
      status: "success",
      data: { tours },
    });
  } catch (error) {
    res.status(400).json({ status: "failed", message: error.message });
  }
};

路由器

const tourController = require("../controllers/tourController");

const router = express.Router();

// router.param("id", tourController.checkID);

router
  .route("/")
  .get(tourController.getAllTours)
  .post(tourController.createTour);

router
  .route("/:id")
  .get(tourController.getTourById)
  .patch(tourController.updateTour)
  .delete(tourController.deleteTour);

module.exports = router;

Package.json

  "name": "natours",
  "version": "1.0.0",
  "description": "fdsfd",
  "main": "index.js",
  "scripts": {
    "start:dev": "nodemon server.js",
    "start:prod": "nodemon server.js NODE_ENV=production "
  },
  "author": "me",
  "license": "ISC",
  "dependencies": {
    "dotenv": "^8.2.0",
    "express": "^4.17.1",
    "mongoose": "^5.12.7",
    "morgan": "^1.10.0"
  },
  "devDependencies": {
    "eslint": "^7.25.0",
    "eslint-config-airbnb": "^18.2.1",
    "eslint-config-prettier": "^8.3.0",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "eslint-plugin-node": "^11.1.0",
    "eslint-plugin-prettier": "^3.4.0",
    "eslint-plugin-react": "^7.23.2",
    "prettier": "^2.2.1"
  }
}

當我嘗試查詢127.0.0.1:3000/api/v1/tours?sort=price時,我得到了響應

{
    "status": "failed",
    "message": "The comparison function must be either a function or undefined"
}

我是一個真正的菜鳥,所以有沒有人知道是什么導致了這個或如何解決它?

let query = await Tour.find(JSON.parse(queryStr));

這是您查詢的結果,因為 await 執行查詢。 如果要存儲查詢,請不要使用await

let query = Tour.find(JSON.parse(queryStr));

// query.sort((a, b) => (a[req.query.sort] > b[req.query.sort] ? 1 : -1));
if (req.query.sort) {
  query = query.sort(req.query.sort);
}

const tours = await query;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM