使用 Mongoose/Express/Node 在一个 POST 路由中保存多个模型文档

Posted

技术标签:

【中文标题】使用 Mongoose/Express/Node 在一个 POST 路由中保存多个模型文档【英文标题】:Save multiple model documents in one POST route with Mongoose/Express/Node 【发布时间】:2018-10-25 22:49:32 【问题描述】:

我的搜索模型和结果模型是一对多的关系。我的用户会进行搜索,选择有用的结果,然后点击保存按钮。该保存按钮将触发app.post() 请求。这应该保存一个搜索实例和一个(或多个)选定结果实例。我可以使用以下代码成功保存 Search 实例:

controllers/searchController.js

const Search = require('../models/search');

exports.search_create_post = (req, res) => 
    let newSearch = new Search( search_text: req.body.search_text );

    newSearch.save((err, savedSearch) => 
        if (err) 
            console.log(err);
         else 
            res.send(savedSearch);
        
    )

routes/search.js

const express = require('express');
const router = express.Router();
const search_controller = require('../controllers/searchController');

//Search Routes
router.get('/', search_controller.search_home);

router.get('/results', search_controller.search_results_get);

router.post('/', search_controller.search_create_post);

module.exports = router;

我怎样才能让我的用户点击一次保存按钮将保存上面的搜索实例以及结果?

【问题讨论】:

【参考方案1】:

我最终通过将两个回调传递到我的post() 路由并在第一个内部调用next() 以及通过req 对象传递第二个所需的数据来完成我需要的操作。我的代码如下:

routes/search.js

router.post('/', search_controller.search_create_post, result_controller.result_create_post);

controllers/searchController.js

exports.search_create_post = (req, res, next) => 
    let newSearch = new Search( search_text: req.body.search_text );

    newSearch.save((err, savedSearch) => 
        if (err) 
            console.log(err);
         else 
            req.searchData = savedSearch;
        
          next();
    )
;

controllers/resultController.js

exports.result_create_post = (req, 
    let newResult = new Result( url: 'req.body.url', search: req.searchData );

    newResult.save((err, savedResult) => 
        if (err) 
            console.log(err);
         else 
            res.send(savedResult);
        
    )
;

【讨论】:

以上是关于使用 Mongoose/Express/Node 在一个 POST 路由中保存多个模型文档的主要内容,如果未能解决你的问题,请参考以下文章

测试使用

第一篇 用于测试使用

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”