node.js - 出现类似 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)时,它开始工作。
解决方案
看完你的堆栈跟踪后,我发现了这个错误的原因。我不会告诉你答案,而是告诉你如何自己找出错误。
错误
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')
})
推荐阅读
- jquery - 如何使用 CSS 为 jQuery 表中的每一行设置不同的图像
- c - 为什么 getchar() 需要不终止我的无限循环?
- objective-c - 从情节提要中的菜单选择将数据传递到表格视图控制器
- python - 将标题作为文件名但不返回
- r - 安装数据表包时,安装包“RcppCCTZ”的退出状态非零
- php - Parsing Sub-Object from an XML Feed with objects
- python - python将下一个字符串刮到给定的字符串
- javascript - 如何在 3d 维度中旋转平面,在 vanilla js 中表示为 1d 数组
- javascript - 连续控制台登录 express graphql 应用程序
- java - 如何在具有 exFAT 格式内存的 USB OTG 设备上执行 CRUD 操作?Fat32 有什么不同吗?