Когда я перемещаю свой код express из файла маршрута в файл контроллера, api не работает. Нажатие на api от почтальона приводит к бесконечному запросу - PullRequest
0 голосов
/ 05 мая 2020

Когда я написал сообщение и получил функцию в authorRouter. js файл, api работали, но когда я переместил эти функции в authorController. js файл в папке контроллеров, api перестали работать. Когда я вызываю api от почтальона, это приводит к бесконечному запросу. Ранее я вызывал функцию контроллера из файла маршрутизатора следующим образом:

.post(controller.post)
.get(controller.get)

, но это выдавало мне ошибку «Route.get () требует функции обратного вызова, но получил [объект Undefined]», поэтому я отредактировал мой файл маршрутизатора, как показано ниже:

authorRouter. js файл

const express = require('express');
const authorController = require('../controllers/authorController');

function routes(Author){
    const authorRouter = express.Router();
    const controller = authorController(Author);
    authorRouter.route('/author')
    .post( function(req, res){
        controller.post
      })
      .get( function(req,res){
           controller.get
       }     
       );
// .post((req,res)=>{
//     const author = new Author(req.body);

//     author.save();
//     return res.status(201).json(author);
// })
// .get((req,res)=>{
//     const query = {};
//     if(req.query.name){
//         query.name = req.query.name;
//     }
//      Author.find(query,(err,authors)=>{
//      if(err){
//          return res.send(err);
//      }
//         return res.json(authors);  
//     });
//  });

authorRouter.use('/author/:authorId',(req,res,next)=>{
    Author.findById(req.params.authorId,(err,author)=>{
        if(err){
            return res.send(err);
        }
        if(author){
            req.author =author;
            return next();
        }
           return res.sendStatus(404);  
       });
});
authorRouter.route('/author/:authorId')
.get((req,res)=>{
    res.json(req.author);
 })
 .put((req,res)=>{
         const {author}  =req;
         author.name = req.body.name;
         author.book = req.body.book;
         author.age = req.body.age;
         req.author.save((err)=>{
            if(err){
                return res.send(err);
            }
            return res.json(author);
        })

 })
 .patch((req,res)=>{
     const { author} =req;
     if (req.body._id){
         delete req.body._id;
     }
     Object.entries(req.body).forEach(item=>{
         const key = item[0];
         const value = item[1];
         author[key]= value;
     });
     req.author.save((err)=>{
         if(err){
             return res.send(err);
         }
         return res.json(author);
     });
 })
 .delete((req,res)=>{
     req.authorId.remove((err)=>{
         if(err){
            return res.send(err);
         }
         return res.sendStatus(204);
     })

 });

 return authorRouter;

}


module.exports= routes;

authorController. js файл

 function authorController(Author){
    function post(req,res){
      const author = new Author(req.body);
      author.save();
      return res.status(201).json(author);
    }

    function get(req,res) {
      const query = {};
      if(req.query.name){
        query.name = req.query.name;
      }
      Author.find(query,(err,authors)=>{
       if(err){
         return res.send(err);
        }
        return res.json(authors);  
      });   
    }
        return(post, get );
  }

  module.exports = authorController;

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 05 мая 2020

Я изменил код в authorRouter. js вернулся к тому, как я раньше вызывал функцию в контроллере

.post(controller.post)
.get(controller.get);

и в файле контроллера я заменил

 return(post, get );

с

return {post,get};

Теперь код работает. Ошибка заключалась в том, что я не использовал фигурные скобки.

0 голосов
/ 05 мая 2020

Можете ли вы попробовать это

.post(function (req, res) {
  controller.post(req, res);
})

Или

.post(controller.post);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...