You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

错误原因

控制器里的逻辑犯了两个关键错误:

  1. 参数传递错误:Users.find()返回的是Mongoose的Query对象,不是查询结果,你直接把这个对象传给res.send(),还错误地把回调函数当成res.send()的第二个参数(res.send()只接受要返回的数据,不支持回调)。
  2. 变量命名冲突:回调里用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 18:57:43