Nodejs - Ошибка: Route.post () требует функцию обратного вызова, но получил [объект Undefined] - PullRequest
1 голос
/ 18 марта 2020

Я не могу понять, почему это приводит к ошибке.

Если я удаляю db.SendTodo из кода в контроллере. js он работает нормально, но кажется, что он не работает для экспорта .sendTodo в databaseConnect. js

databaseConnect. js Файл -

// Код

const mongo = require('mongodb');
let db = mongo.MongoClient
const assert = require('assert');
let url = "mongodb://127.0.0.1:27017/"
const express = require('express')
const bodyParser= require('body-parser')
const app = express()
app.use(bodyParser.urlencoded({extended: true}))
db.connect(url, function(err, client) {
  if (err) {
    console.log("Not Responding " + err);
  }else {
    console.log("Connection Established");
    let database = client.db('todo_app_node');
    let coll = database.collection("todos")

     //Error is here 
     exports.SendTodo = (req, res) => {
      console.log("Whoooo");
      coll.insertOne(body, (err, result) => {
      if (err) return console.log(err)
        console.log('saved to database')
        res.redirect('/')
        next()
      })
    }

    //Show The Result
    coll.find({}).toArray(function(err, result) {
      if (err) {
        console.log(err);
      }else if (result.length) {
        //Responding to the requests
         exports.item = result
      }else {
        console.log("A error occured");
      }
      client.close()
    })
  }
})

Маршрутизатор. js

const express = require("express")
const router = express.Router()
const bodyParser= require('body-parser')
const controler = require('./controller/controller.js');
const db = require('./controller/databaseConnect.js');


router.get("/", controler.renderPage);
router.post('/send', db.SendTodo)//Error is this line
router.get("/css/index.css", controler.cssFiles);
module.exports = router;

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

вызываемая функция next () не в аргументах. Таким образом, он выдает ошибку.

В маршрутизаторе:


router.post ('/ send', db.SendTodo, the_actual_function_to_called_next);


В контроллере: (добавьте следующий, чтобы он передавался от маршрутизатора)

exports.SendTodo = (req, res,next) => {
console.log("Whoooo");
coll.insertOne(body, (err, result) => {
    if (err) return console.log(err)
    console.log('saved to database')
    res.redirect('/')
    next()
})

}

0 голосов
/ 18 марта 2020

Ваша .SendTodo функция требует немного работы. Поместите next в список аргументов, затем используйте его правильно. Попробуйте это.

exports.SendTodo = (req, res, next) => {   // add next to parameter list
  console.log("Whoooo");
  coll.insertOne(body, (err, result) => {
  if (err) return next(err)                // send your error to next()
    console.log('saved to database')
    return res.redirect('/')               // don't use next() after redirect()
  })
}

Вот документация по обработке ошибок в express.

И когда ваш обработчик маршрута завершит ответ на входящий запрос, не делайте т звоните next(); все готово.

...