首页 > 解决方案 > 出现类似 Route.post() 的错误需要回调函数,但在 express 中有一个 [object String]

问题描述

我正在研究 express API,我面临以下问题。

    /Users/rishavkumar/Documents/GitHub/TTCBackendAPI/node_modules/express/lib/router/route.js:202
        throw new Error(msg);
        ^

Error: Route.post() requires a callback function but got a [object String]
    at Route.<computed> [as post] (/Users/rishavkumar/Documents/GitHub/TTCBackendAPI/node_modules/express/lib/router/route.js:202:15)
    at Object.<anonymous> (/Users/rishavkumar/Documents/GitHub/TTCBackendAPI/src/routes/v1/blog.route.js:8:5)
    at Module._compile (internal/modules/cjs/loader.js:1072:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
    at Module.load (internal/modules/cjs/loader.js:937:32)
    at Function.Module._load (internal/modules/cjs/loader.js:778:12)
    at Module.require (internal/modules/cjs/loader.js:961:19)
    at require (internal/modules/cjs/helpers.js:92:18)
    at Object.<anonymous> (/Users/rishavkumar/Documents/GitHub/TTCBackendAPI/src/routes/v1/index.js:2:19)
    at Module._compile (internal/modules/cjs/loader.js:1072:14)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1101:10)
    at Module.load (internal/modules/cjs/loader.js:937:32)
    at Function.Module._load (internal/modules/cjs/loader.js:778:12)
    at Module.require (internal/modules/cjs/loader.js:961:19)
    at require (internal/modules/cjs/helpers.js:92:18)
    at Object.<anonymous> (/Users/rishavkumar/Documents/GitHub/TTCBackendAPI/src/app.js:13:16)
[nodemon] app crashed - waiting for file changes before starting...

这是我在控制器文件夹 blog.controller.js 中的控制器

    const httpStatus = require('http-status');
const catchAsync = require('../utils/catchAsync');


const createBlog = catchAsync(async (req, res) => {
    const blog = await blogService.createBlog(req.body);
    res.status(httpStatus.CREATED).send(blog);
  });


  module.exports = {
    createBlog
  }; 

这是 services 文件夹中的 blog.service.js

    const { Blog } = require('../models');

/**
 * Create a blog
 * @param {Object} blogBody
 * @returns {Promise<Blog>}
 */
 const createBlog = async (blogBody) => {
    return Blog.create(blogBody);
  };


  module.exports = {
    createBlog
  };  

这是服务文件夹中的 index.js

    module.exports.authService = require('./auth.service');
module.exports.emailService = require('./email.service');
module.exports.tokenService = require('./token.service');
module.exports.userService = require('./user.service');
module.exports.blogService = require('./blog.service');

这是 routes/v1 文件夹中的 blog.route.js

    const express = require('express');
const blogController = require('../../controllers/blog.controller');

const router = express.Router();

router
   .route('/')
   .post('manageBlogs', blogController.createBlog)


module.exports = router;

这是 routes/v1 文件夹中的 index.js

    const express = require('express');
const blogRoute = require('./blog.route');
const authRoute = require('./auth.route');
const userRoute = require('./user.route');
const docsRoute = require('./docs.route');
const config = require('../../config/config');

const router = express.Router();

const defaultRoutes = [
  {
    path: '/auth',
    route: authRoute,
  },
  {
    path: '/users',
    route: userRoute,
  },
  {
    path: '/blogs',
    route: blogRoute,
  }
];

const devRoutes = [
  // routes available only in development mode
  {
    path: '/docs',
    route: docsRoute,
  },
];

defaultRoutes.forEach((route) => {
  router.use(route.path, route.route);
});


if (config.env === 'development') {
  devRoutes.forEach((route) => {
    router.use(route.path, route.route);
  });
}

module.exports = router;

这是我的模型 blog.model.js

    const mongoose = require('mongoose');
const { toJSON, paginate } = require('./plugins');
const blogSchema = mongoose.Schema(
  {
    title: {
      type: String,
      required: true,
      trim: true,
    },
    slug: {
      type: String,
      required: true,
      trim: true,
    },
    shortdescription: {
      type: String,
      required: true,
    },
    description: {
      type: String,
      required: true,
      trim: true,
    },
    author: {
      type: String,
      required: true,
      trim: true,
    },
    date: { type: Date, default: Date.now },
    image: { type: String },
    country: [{
      name: {
        type: String,
        trim: true
      },
      countryid: {
        type: Number,
        trim: true
      },
      isocode: {
        type: String,
        trim: true
      }  
      }],
    city: [{
      name: {
        type: String,
        trim: true
      },
      cityid: {
        type: Number,
        trim: true
      }
      }],
    category: [{
      name: {
        type: String,
        trim: true
      },
      catid: {
        type: Number,
        trim: true
      }
    }],
    seo: {
      metatitle: {
       type: String,
       required: true,
       trim: true,
      },
      metadesc: {
        type: String,
        trim: true,
      },
      metakeywords: {
        type: String,
        trim: true,
      }
    }
  },
  {
    timestamps: true,
  }
);

// add plugin that converts mongoose to json
blogSchema.plugin(toJSON);
blogSchema.plugin(paginate);


/**
 * @typedef Blog
 */
const Blog = mongoose.model('Blog', blogSchema);

module.exports = Blog;

当我从 blog.routes.js 中删除.post('manageBlogs', blogController.createBlog)时,它开始工作。

标签: node.jsexpress

解决方案


看完你的堆栈跟踪后,我发现了这个错误的原因。我不会告诉你答案,而是告诉你如何自己找出错误。

错误

Error: Route.post() requires a callback function but got a [object String]

堆栈跟踪的第一行说

  at Route.<computed> [as post] (/Users/rishavkumar/Documents/GitHub/TTCBackendAPI/node_modules/express/lib/router/route.js:202:15)

它谈论的东西来自node_modules所以我们不在乎

下一行

 at Object.<anonymous> (/Users/rishavkumar/Documents/GitHub/TTCBackendAPI/src/routes/v1/blog.route.js:8:5)

看这不是来自node_modules,这是/src/routes/v1/blog.route.js:8:5我们的

/src/routes/v1/blog.route.js:8:5

8 表示第 8 行 5 表示 fif 字符。所以让我们数数

第 8 行是这个

 .post('manageBlogs', blogController.createBlog)

错误说Error: Route.post() requires a callback function but got a [object String]

如果我们去表达文档:https ://expressjs.com/en/guide/routing.html

我们可以找到示例

app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Add a book')
  })
  .put(function (req, res) {
    res.send('Update the book')
  })

现在比较你拥有的那个

router
   .route('/')
   .post('manageBlogs', blogController.createBlog)

用快递给的

app.route('/book')
  .get(function (req, res) {
    res.send('Get a random book')
  })
  .post(function (req, res) {
    res.send('Add a book')
  })
  .put(function (req, res) {
    res.send('Update the book')
  })

推荐阅读