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

Node.js搭配mongoose开发出现The "path" argument must be of type string报错

错误原因分析
  • 核心触发点是app.js中POST /register接口的catch代码块,你直接调用了res.render(err),res.render方法第一个参数要求传入视图名称的字符串类型值,你传入了错误对象,Express的视图渲染模块要拿该参数拼接模板路径读取文件,自然触发类型不匹配报错。
  • 导致进入catch块的前置原因:你没有配置Express解析POST请求体的中间件,req.body默认是undefined,访问req.body.fname会抛出类型错误,被catch捕获后将错误对象传给了render方法。
  • 额外的字段匹配问题:你的注册表单里姓名字段的name属性是firstname,不是fname,就算请求体解析正常,访问req.body.fname也会拿到undefined。
解决方案
  1. 先在app.js的路由定义前添加请求体解析中间件,代码如下:
const path = require('path');
const hbs = require('hbs');
const express = require('express');
const app = express();
require('./db/connect');
const port = process.env.PORT || 4000;

// 新增两行解析中间件
app.use(express.json())
app.use(express.urlencoded({ extended: true }))

const templatePath = path.join(__dirname, '../templates/views')
const partialsPath = path.join(__dirname, '../templates/partials')
app.set('view engine', 'hbs');
app.set('views', templatePath)
hbs.registerPartials(partialsPath);
  1. 修改POST /register接口的逻辑,修正字段读取和catch块的渲染逻辑:
app.post('/register', async (req, res) => {
    try {
        // 修正字段名和表单name属性匹配
        console.log(req.body.firstname);
        // 后续可在此处添加Mongoose保存用户数据的逻辑
        res.render('register', { msg: '注册成功' })
    } catch (err) {
        console.error(err)
        // 不要直接传错误对象给render第一个参数,仍渲染注册页,传入错误信息做展示
        res.render('register', { error: err.message })
    }
})
  1. 如果需要在页面展示提示信息,可在register.hbs的表单上方添加如下代码:
{{#if error}}
<div style="color: red; padding: 10px 0;">{{error}}</div>
{{/if}}
{{#if msg}}
<div style="color: green; padding: 10px 0;">{{msg}}</div>
{{/if}}

内容的提问来源于stack exchange,提问作者amit yadav

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:15:02