首页 > 解决方案 > 错误:Route.post() 需要一个回调函数,但得到一个 [object Undefined],不知道如何继续

问题描述

为了让您了解情况,我不知道如何使用 mongodb、mongoose 和下面显示的所有其他工具。很久以前我使用教程来实现此代码,现在我看到自己需要扩展我正在从事的项目。所以现在我试图在这里和那里从头开始以形成所需的代码。

情况是我正在复制所需的文件以创建另一个模型/集合。我拥有与“用户”相关的所有文件,现在我愿意对“repair_dispatches”进行 CRUD (如下所示的“partes_reparacion”)

因此,在名为 server.js 的主文件中:

    'use strict'
const express = require('express');
const app = express();
const cors = require('cors');
const bodyParser = require('body-parser');
const bodyParserJSON = bodyParser.json({limit: '50mb',extended:true});
const bodyParserURLEncoded = bodyParser.urlencoded({extended: true, limit: '50mb'});
const configMensaje = require('./configMensaje');
const authRoutes = require('./auth/auth.routes');
const router = express.Router();
const properties = require('./auth/config/properties');
const DB = require('./auth/config/db');
const expressjwt = require('express-jwt');
const reparacionesRoutes = require('./reparaciones/reparaciones.routes');

DB();
app.use(bodyParserJSON);
app.use(bodyParserURLEncoded);
app.use(cors({origin: "*"}))
app.use((req, res, next) => {
  res.header('Access-Control-Allow-Origin', '*');
  res.header('Access-Control-Allow-Headers', 'Authorization, X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Allow-Request-Method');
  res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, DELETE');
  res.header('Allow', 'GET, POST, OPTIONS, PUT, DELETE');
  next();
});

app.use('/api',router);
authRoutes(router);
reparacionesRoutes(router); <<--this is the line that when inserted, gives the error.

router.get('/', (req,res)=>{
    res.send('Hello from home');
});

app.use(router);

app.listen(properties.PORT, () => console.log(`Server running on port ${properties.PORT}`));

我刚刚从我的 auth 文件夹中复制了文件,其中包括:auth.controller.js、auth.dao.js、auth.model.js 和 auth.routers.js,为修复模型创建了另一个文件夹,并更改了所有相关内容,保持结构不变:

reparaciones.controller.js

const parte = require('./reparaciones.dao');
const jwt = require('jsonwebtoken')

exports.guardarParte = (req,res,next) =>{
    /* console.log("request:xxxxxxxxxx "+JSON.stringify(req.body)); */
    const newParte = {
        id: req.body.id,
        nombre: req.body.nombre,
        telefono:  req.body.telefono,
        ref: req.body.ref,
        marca: req.body.marca,
        fecha: req.body.fecha,
        averia: req.body.averia 
    }
    console.log(req.body);
    parte.update({'id':newParte.id},newParte, (err,res)=>{
        if(err && err.code === 11000){
            return res.status(409).send("El parte ya existe(?)");
        }
        if(err){
            console.log(err);
            return res.status(500).send("No se ha podido crear el parte");
        }
            //response
            res.send(newParte)
    })

}

reparaciones.dao.js

const mongoose = require('mongoose');
const authSchema = require('./reparaciones.model');

authSchema.statics = {
    guardar: function (data,cb){
        const parte = new this(data);
        parte.guardar(cb);
    },
    borrar: function (data,cb){
        const parte = new this(data);
        parte.delete(cb);
    },
    buscaruno: function(query,cb){
        this.find(query,cb);
    },
    cargartodos: function(query,cb){
        this.find(query,cb);
    }
}

const authModel = mongoose.model('partes_reparacion',authSchema);
module.exports = authModel;

reparaciones.model.js

const mongoose = require('mongoose');
const Schema = mongoose.Schema;
mongoose.set('useCreateIndex',true);
mongoose.set('useUnifiedTopology',true);

const reparacionSchema = new Schema({
    id: {
        type: String,
        required: false,
        trim: true,
        unique: true
    },
    nombre: {
        type: String,
        required: false,
        trim: true,
        unique: true
    },
    telefono: {
        type: Number,
        required: false,
        trim: true
    },
    ref: {
        type: String,
        required: false,
        trim: true
    },
    marca: {
        type: String,
        required: false,
        trim: true
    },
    fecha: {
        type: String,
        required: false,
        trim: true
    },
    averia: {
        type: String,
        required: false,
        trim: true
    },
},{
    timestamps: true
});

module.exports = reparacionSchema;

reparaciones.routes.js

const Parte = require('./reparaciones.controller');
module.exports = (router)=>{
    router.post('/guardarParte', Parte.guardarParte);
    router.post('/buscaruno', Parte.buscarUnParte);
    router.post('/cargartodos', Parte.cargarTodosPartes);
}

因此,这 4 个文件只是对 auth 文件的修改,它们可以正常工作。但是在 server.js 中添加行时“reparacionesRoutes(router);” 如第一个代码片段所示,我得到了提到的错误。我不知道为什么仅仅通过包含另一个实例就会给出错误。

此外,在使用 npm start 启动服务器后,它会转到 mongodb://localhost:27017/users。它不应该从根目录开始,所以我根据帖子网址转到所需的路线吗?

标签: node.jsmongodbmongoose

解决方案


可能不是您正在寻找的答案。只是提到一些我注意到的事情。

在下面的代码中,您将导入./reparaciones.controllerParte. 但是您只能guardarParte像这样从控制器中导出:- exports.guardarParte = (req,res,next) =>{

我没有在您共享的文件中看到exports.buscarUnParteexports.cargarTodosPartes。(我假设您共享了完整的文件)。

因此Parte.buscarUnParte,并且Parte.cargarTodosPartes评估为未定义。

const Parte = require('./reparaciones.controller');
module.exports = (router)=>{
    router.post('/guardarParte', Parte.guardarParte);
    router.post('/buscaruno', Parte.buscarUnParte); //2nd parameter is undefined
    router.post('/cargartodos', Parte.cargarTodosPartes); //2nd parameter is undefined
}

希望这将为您指明正确的方向。


推荐阅读