【问题标题】:Nodejs - Error: Route.post() requires a callback function but got a [object Undefined]Nodejs - 错误:Route.post() 需要一个回调函数,但得到一个 [object Undefined]
【发布时间】:2020-06-29 12:57:50
【问题描述】:

我无法弄清楚为什么会出现错误。

如果我从 controller.js 中的代码中删除 db.SendTodo,它可以正常工作,但它似乎不适用于 databaseConnect.js 中的 exports.sendTodo

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()
    })
  }
})

Router.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;

【问题讨论】:

    标签: node.js mongodb express routing


    【解决方案1】:

    您的.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()
      })
    }
    

    Here's documentation on error handling in express.

    并且,当您的路由处理程序完成对传入请求的响应时,不要调用next();你已经完成了。

    【讨论】:

    • 对不起,但这不起作用,仍然给我同样的错误。
    【解决方案2】:

    被调用的 next() 函数不在 args 中。所以它抛出了错误。

    在路由器中:


    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()
    })
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-20
      • 1970-01-01
      • 2018-06-11
      相关资源
      最近更新 更多