如何在nodejs和mongodb中制作搜索api

我正在尝试使用 nodejs 和 MongoDB 制作搜索 api。我试图用谷歌搜索这个,我确实在那里找到了一些东西,但是在尝试实施时我得到一个错误提示。老实说,我不知道如何解决这个问题,我对制作搜索 API 一无所知。所以任何帮助或建议都会对我有所帮助。


这是我在 google Building a simple search api上找到的帖子的链接。


错误


{

    "error": {

        "message": "Cast to ObjectId failed for value \"search\" at path \"_id\" for model \"Post\"",

        "name": "CastError",

        "stringValue": "\"search\"",

        "kind": "ObjectId",

        "value": "search",

        "path": "_id"

    }

}

这是我的代码


postController.search = (req, res) => {

    var response = [];

    if(typeof req.query.title !== 'undefined'){

        db.Post.filter(function(post) {

            if(post.title === req.query.title){

                console.log(req.body);

                response.push(post);

                console.log(post);

            }

        });

    }

    response = _.uniqBy(response, '_id');

    if(Object.key(req.query).length === 0){

        response = db.Post

    }

    res.json(response);

};

集合中的数据


"data": [

    {

        "isDeleted": false,

        "_comments": [],

        "_id": "5d39122036117d2ea81b434c",

        "title": "facebook  post",

        "link": "facebook.com",

        "_creator": {

            "createdAt": "2019-07-25T01:42:21.252Z",

            "username": "adityakmr"

        },

        "createdAt": "2019-07-25T02:21:20.634Z",

        "__v": 0

    },

]


HUX布斯
浏览 137回答 3
3回答

杨__羊羊

如果您正在尝试创建一个 API 来根据标题搜索 mongoDB 集合,即;文本字段尝试实现 mongoDB 的文本搜索功能:在 mongoDB 中进行文本搜索 ,只需在标题字段上创建一个文本索引,然后使用 post 方法创建一个 API,该 API 接受可以针对标题字段查询的参数。文本搜索可能有点棘手,它可以帮助您进行模糊/部分/全文搜索 - 使用正则表达式也非常有益。

收到一只叮咚

首先,您需要async/await用于模块化您的代码。我建议不要在你的controller.js文件中写你的全部代码,API 可以按照(路由 - 控制器 - utils)的方式制作。postRoutes.js postRouter.get('/search-post', postCtr.searchPost);postController.jsconst postUtils = require('./postUtils');const postController = {};postController.searchPost = async (req, res) => {  try {    const { title } = req.query;    const result = await postUtils.searchPost(title);    return res.status(200).json(result);  } catch (err) {    return res.status(err.code).json({ error: err.error });  }};module.exports = postController;postUtils.jsconst Post = require('./postModel');const postUtils = {};postUtils.searchPost = async (title) => {  try {    let result = [];    if(title){      // Even you can perform regex in your search       result = await Post.find({ title: title });    }     return result;  } catch (err) {    const errorObj = { code: 500, error: 'Internal server error' }; // It can be dynamic    throw errorObj;  }};module.exports = postUtils;postModel.jsconst mongoose = require('mongoose');const postSchema = new mongoose.Schema({  user: {    type: mongoose.Schema.Types.ObjectId,    ref: 'user',    required: true,  },  // Your fields ...}, { collection: 'post', timestamps: true });const post = mongoose.model('post', postSchema);module.exports = post;使用这种结构,您可以轻松调试代码,而且它也易于管理。

慕田峪7331174

在您上面指定的链接中,他们使用存储在名为 的文件中的对象数组store.js,但不是 mongoDB。因此,他们直接使用Array.filter方法进行过滤。但是在使用 mongoose(对象建模工具)的 mongoDB 中,您可以使用collection.find()方法。所以你的问题的解决方案如下postController.search = async (req, res) => {    var response = [];    if (req.query.title) {         response = await db.Post.find({title: req.query.title});    }    res.json(response); };find 是内置的查询方法,有助于查询集合,您可以传递多个属性进行查询。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript