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

Nuxt+TS环境下Nodemailer发送HTML内容显示[object Object]问题

问题描述

我正尝试在Vue组件中通过POST请求传递一个包含HTML代码的变量至后端API,使用TypeScript+Nuxt.js(Node+Vue)技术栈。

组件中获取table元素的代码:

const order_list = document.querySelector('table') as HTMLInputElement | null;

发送请求的代码:

sendMail(){
  $fetch("/api/prenota/mail",{
    method: "POST",
    body: {
      order_list : this.order_list,
      }
  });
  console.log(this.order_list)
},

Vue组件内的console.log能输出正确的HTML内容,但API中用Nodemailer发送邮件时,正文显示为[object Object]。我尝试强制将变量转为字符串,却没有效果,请问哪里操作出错了?

API处理函数代码:

export default defineEventHandler(async function(event) {
    const user = decodingUser(event)
    requireLogin(user)
    const { order_list } = await readBody(event)

    let mailOptions = {
    
        to: 'user1@example.com',
        subject: 'Nice Nodemailer test',
        text: 'AAAAAAAAAAAAAAAA ',
        html: `${{order_list}}`,
    };
    try {
        return await transport.sendMail(mailOptions)
    } catch(err) {
       console.log(err)
       return err
    }
});
解决方案

问题出在前端传递的是DOM对象而非HTML字符串,以及后端模板字符串的错误写法,具体修正步骤如下:

1. 前端:传递DOM元素的HTML内容而非DOM对象

document.querySelector('table')获取到的是DOM元素对象,浏览器的console.log会友好展示元素结构,但实际传递给后端的是对象,需要先提取其HTML内容:

修正后的前端代码

// 获取table元素的HTML字符串,添加空值兜底
const orderList = document.querySelector('table')?.innerHTML || '';

sendMail(){
  $fetch("/api/prenota/mail",{
    method: "POST",
    body: {
      order_list: orderList // 传递HTML字符串而非DOM对象
    }
  });
  console.log(orderList)
},

额外提示:Vue组件内建议优先通过响应式数据生成HTML,再复用数据拼接字符串,尽量避免直接操作DOM,更符合Vue的设计逻辑。

2. 后端:修正模板字符串的错误写法

后端代码中html: ${{order_list}}是错误写法——${{order_list}}等价于在模板字符串里插入{order_list}这个对象,转成字符串自然就是[object Object]`,直接使用变量即可:

修正后的后端代码

export default defineEventHandler(async function(event) {
    const user = decodingUser(event)
    requireLogin(user)
    const { order_list } = await readBody(event)

    let mailOptions = {
        to: 'user1@example.com',
        subject: 'Nice Nodemailer test',
        text: 'AAAAAAAAAAAAAAAA ',
        html: order_list, // 直接传入HTML字符串
    };
    try {
        return await transport.sendMail(mailOptions)
    } catch(err) {
       console.log(err)
       return err
    }
});

额外注意点

  • 可以给前端的orderList添加空值判断,避免邮件正文为空。
  • 如果HTML内容存在XSS风险,建议在后端对HTML进行过滤处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:19