Node.js与Mongoose参数查询用户触发ERR_INVALID_ARG_TYPE错误排查
问题描述
我尝试通过URL参数按用户名查询数据库中的用户,已经编写了服务端、路由及控制器代码。当向..../users/gokdeniz(该用户在数据库中存在)发起GET请求时,触发TypeError [ERR_INVALID_ARG_TYPE]错误,错误提示res.send()接收了非法的函数类型参数。
现有代码
服务端代码
const express = require("express"); const mongoose = require("mongoose"); const app = express(); //ROUTES const userRoute =require("./src/routes/userRoutes"); const postRoute =require("./src/routes/postRoutes"); const commentRoute =require("./src/routes/commentRoutes"); const port = process.env.PORT || 5000; mongoose.connect("mongodb://localhost:27017/projectDB", {useNewUrlParser: true}); app.use(express.json()); app.use(express.urlencoded()); app.get("/", (req, res) =>{ res.send("hello"); }); app.use("/", userRoute, postRoute, commentRoute); app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`));
路由代码
const express = require('express'); const userRouter = express.Router(); const userController = require("../controllers/userController"); userRouter.route("/users/:userName") .get(userController.getUser) .patch(userController.updateUser) .delete(userController.deleteUser) .post(userController.newUser); module.exports = userRouter;
控制器代码
const mongoose = require("mongoose"); const Users = require("../models/userModel"); module.exports.getUser = (req, res) => { console.log(req.params.userName); res.status(200).send(Users.find({name: req.params.userName}), (err, res)=>{ if (res.err){ console.log("USER NOT FOUND"); }else{ console.log("Success!"); } }); };
错误信息
TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received type function ([Function (anonymous)]) at new NodeError (node:internal/errors:371:5) at Function.from (node:buffer:322:9) at ServerResponse.send (C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\node_modules\express\lib\response.js:193:22) at module.exports.getUser (C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\src\controllers\userController.js:6:21) at Layer.handle [as handle_request] (C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\node_modules\express\lib\router\layer.js:95:5) at next (C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\node_modules\express\lib\router\route.js:144:13) at Route.dispatch (C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\node_modules\express\lib\router\route.js:114:3) at Layer.handle [as handle_request] (C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\node_modules\express\lib\router\layer.js:95:5) at C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\node_modules\express\lib\router\index.js:284:15 at param (C:\Users\tlege\OneDrive\Masaüstü\project 1\untitled_project\Server\node_modules\express\lib\router\index.js:365:14)
错误原因
控制器里的逻辑犯了两个关键错误:
- 参数传递错误:
Users.find()返回的是Mongoose的Query对象,不是查询结果,你直接把这个对象传给res.send(),还错误地把回调函数当成res.send()的第二个参数(res.send()只接受要返回的数据,不支持回调)。 - 变量命名冲突:回调里用
res作为第二个参数,覆盖了Express的响应对象res,导致后续逻辑完全混乱。
修复方案
推荐用async/await写法,代码更清晰易维护:
修复后的控制器代码(async/await版)
const mongoose = require("mongoose"); const Users = require("../models/userModel"); module.exports.getUser = async (req, res) => { try { console.log(req.params.userName); // 按用户名查询用户,find返回数组,若只需单个用户可改用findOne const users = await Users.find({name: req.params.userName}); if (users.length === 0) { console.log("USER NOT FOUND"); return res.status(404).send("用户不存在"); } console.log("Success!"); res.status(200).send(users); } catch (err) { console.error("查询出错:", err); res.status(500).send("服务器内部错误"); } };
如果习惯用回调写法,修正后的代码如下:
修复后的控制器代码(回调版)
const mongoose = require("mongoose"); const Users = require("../models/userModel"); module.exports.getUser = (req, res) => { console.log(req.params.userName); // 把回调函数放在find方法里,且避免变量名冲突 Users.find({name: req.params.userName}, (err, users) => { if (err) { console.error("查询出错:", err); return res.status(500).send("服务器内部错误"); } if (users.length === 0) { console.log("USER NOT FOUND"); return res.status(404).send("用户不存在"); } console.log("Success!"); res.status(200).send(users); }); };
内容的提问来源于stack exchange,提问作者Bot Ellis
相关产品推荐
相关产品推荐

