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。
解决方案
- 先在
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);
- 修改
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 }) } })
- 如果需要在页面展示提示信息,可在
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
相关产品推荐
相关产品推荐

