[英]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.