Express出现Route.post()需回调函数却得到[object String]报错如何解决
报错根本原因
Express 中router.route(基础路径)的作用是预先绑定当前路由的根路径,返回的路由实例后续链式调用的.post()、.get()等方法,仅接受中间件函数、路由处理函数作为参数,不支持再传入额外路径字符串。
你在blog.route.js中的写法是先通过.route('/')绑定了基础路径,之后.post()第一个参数传入了字符串'manageBlogs',不符合参数要求,Express 期望接收回调函数却拿到了字符串,因此抛出对应报错。
正确配置方案
根据你实际需要的接口路径选择对应写法即可:
方案1:期望POST接口路径为 /blogs/manageBlogs
有两种等效写法可选:
- 写法A:将子路径配置在
route方法中
// blog.route.js 代码修改为 const express = require('express'); const blogController = require('../../controllers/blog.controller'); const router = express.Router(); router .route('/manageBlogs') .post(blogController.createBlog) module.exports = router;
- 写法B:不使用链式调用,直接声明路由
// blog.route.js 代码修改为 const express = require('express'); const blogController = require('../../controllers/blog.controller'); const router = express.Router(); router.post('/manageBlogs', blogController.createBlog) module.exports = router;
方案2:期望POST接口路径为 /blogs/
直接删除.post()方法中多余的字符串参数即可,也就是你测试验证过的可用写法:
// blog.route.js 代码修改为 router .route('/') .post(blogController.createBlog)
额外注意
你当前的blog.controller.js中直接使用了blogService但没有导入该模块,后续运行会触发blogService is not defined报错,需要在文件顶部补全导入语句:
const httpStatus = require('http-status'); const catchAsync = require('../utils/catchAsync'); // 新增导入blogService const { blogService } = require('../services'); const createBlog = catchAsync(async (req, res) => { const blog = await blogService.createBlog(req.body); res.status(httpStatus.CREATED).send(blog); }); module.exports = { createBlog };
内容的提问来源于stack exchange,提问作者Vinay Thakur
相关产品推荐
相关产品推荐

