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

Dart向Node.js发POST请求报“Product is not a constructor”错误排查

问题:Flutter向Node.js发送POST请求添加商品时出现"Product is not a constructor"错误

问题背景

我正在开发Flutter应用,通过Dart向Node.js服务器发送POST请求添加商品,但服务器返回“Product is not a constructor”错误。

客户端相关代码

admin_services.dart

import 'dart:convert';
import 'dart:io';

import 'package:cloudinary_public/cloudinary_public.dart';
import 'package:flutter/material.dart';
import 'package:http/http.dart' as http;
import 'package:provider/provider.dart';
import 'package:swadesh/constants/errors.dart';
import 'package:swadesh/constants/global_variables.dart';
import 'package:swadesh/constants/utils.dart';
import 'package:swadesh/models/product.dart';
import 'package:swadesh/providers/user_provider.dart';

class AdminServices {
  void sellProduct({
    required BuildContext context,
    required String name,
    required String description,
    required double price,
    required double quantity,
    required String category,
    required List<File> images,
  }) async {
    final userProvider = Provider.of<UserProvider>(context, listen: false);

    try {
      final cloudinary = CloudinaryPublic('dypdblusf', 'pmfi2yqj');
      List<String> imageUrls = [];

      // Upload images to Cloudinary and collect URLs
      for (int i = 0; i < images.length; i++) {
        CloudinaryResponse res = await cloudinary.uploadFile(
          CloudinaryFile.fromFile(images[i].path, folder: name),
        );
        imageUrls.add(res.secureUrl);
      }

      // Create product object
      Product product = Product(
        name: name,
        description: description,
        quantity: quantity,
        images: imageUrls,
        category: category,
        price: price,
      );

      // Convert product object to JSON
      String jsonBody = json.encode(product.toMap());

      // Send HTTP POST request to server
      http.Response res = await http.post(
        Uri.parse('$uri/admin/add-product'),
        headers: {
          'Content-Type': 'application/json; charset=UTF-8',
          'x-auth-token': userProvider.user.token,
        },
        body: jsonBody,
      );

      // Handle the response
      httpErrorHandle(
        response: res,
        context: context,
        onSuccess: () {
          showSnackBar(context, 'Product Added Successfully!');
          Navigator.pop(context);
        },
      );
    } catch (e) {
      showSnackBar(context, e.toString());
    }
  }
}

product.dart

import 'dart:convert';

class Product {
  final String name;
  final String description;
  final double quantity;
  final List<String> images;
  final String category;
  final double price;

  Product({
    required this.name,
    required this.description,
    required this.quantity,
    required this.images,
    required this.category,
    required this.price,
  });

  Map<String, dynamic> toMap() {
    return <String, dynamic>{
      'name': name,
      'description': description,
      'quantity': quantity,
      'images': images,
      'category': category,
      'price': price,
    };
  }

  factory Product.fromMap(Map<String, dynamic> map) {
    return Product(
      name: map['name'],
      description: map['description'],
      quantity: map['quantity'].toDouble(),
      images: List<String>.from(map['images']),
      category: map['category'],
      price: map['price'].toDouble(),
    );
  }

  String toJson() => json.encode(toMap());

  factory Product.fromJson(String source) =>
      Product.fromMap(json.decode(source));
}

服务器返回错误

{
  "error": "Product is not a constructor"
}

已确认信息

  • 服务器端Product模型定义与导入无误
  • 发送的JSON payload格式正确
  • Dart端Product类结构与Node.js端预期一致

成因分析及解决方法

该错误完全出在Node.js服务器端,与Flutter客户端代码无关。以下是常见触发场景及修复方案:

1. 模型导入方式错误

若Node.js代码中错误地将默认导出当作命名导入,会导致Product不是构造函数:

// 错误写法(假设Product是默认导出)
const { Product } = require('./models/Product');

// 正确写法(根据导出方式选择):
// CommonJS默认导出
const Product = require('./models/Product');
// ES模块默认导出
import Product from './models/Product.js';

2. 模型定义语法错误

检查Node.js的Product模型文件,确保类/Schema定义正确:

// 错误示例:类名拼写错误、未正确定义模型
class Prodcut { // 拼写错误
  // ...
}

// 正确示例(以Mongoose为例):
const mongoose = require('mongoose');
const ProductSchema = new mongoose.Schema({
  name: String,
  description: String,
  quantity: Number,
  images: [String],
  category: String,
  price: Number
});

// 确保正确导出模型
module.exports = mongoose.model('Product', ProductSchema);

3. 变量名冲突

检查服务器代码中是否有同名变量覆盖了Product模型引用:

// 错误示例:变量名冲突导致模型被覆盖
const Product = 'some string';

// 正确:确保模型变量名唯一且未被重新赋值
const Product = require('./models/Product');

4. 异步模块加载问题

若使用动态导入,需等待模块加载完成再使用:

// 错误示例:未等待动态导入完成,得到的是Promise而非类
const Product = import('./models/Product');

// 正确写法:
async function addProduct(req, res) {
  const { default: Product } = await import('./models/Product.js');
  const newProduct = new Product(req.body);
  // 后续保存逻辑
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 20:05:58