NodeJS и mongoose CastError: ошибка приведения к [ObjectId] для значения

#node.js #mongodb #mongoose #moleculer

#node.js #mongodb #mongoose #молекулярный

Вопрос:

Я использую действия molecularjs для ввода данных в свою базу данных. В первую очередь я использую NodeJS с mongoose для определения моделей. Пока я могу создать модель, но когда я пытаюсь создать отношение «один ко многим», это выдает мне эту ошибку

ошибки: { ‘deliveryParcels.0’: Ошибка CastError: приведение к [ObjectId] не удалось для значения «[{«parcelId»:»LHE660851871415″,»address»:»24 E мухафиз город Лахор»,»type»:»COD»,»addressLocation»: {«широта»: 31.4532941,»lng»:74.2166403},»CustomerName»: «ALI MALHI»,»customerPhone»:»3314488396″,»processingStatus»:»pending»,»amount»:2500,»vendorOrderId»:»other»}] » на пути «deliveryParcels.0»

Я хочу, чтобы обе коллекции rider-tasks и delivery-parcels создавались одновременно, но создается только rider-tasks коллекция, но не delivery-parcels . Что я делаю не так в своей схеме?

Вот мои модели

модель rider-tasks

 import mongoose, { Schema } from "mongoose";
import { getDbConnection } from "../../../utils/db/db-connect";

/* eslint-disable id-blacklist */
import { IRiderTaskModel } from "../interfaces/rider-task.interface";
const RiderTaskSchema: Schema<IRiderTaskModel> = new Schema<IRiderTaskModel>(
    {
        _id: { type: String, required: true, unique: true },
        riderId: { type: String, required: true },
        totalAmount: { type: Number, required: true },
        riderName: { type: String, required: true },
        cityId: { type: String, required: true },
        cityName: { type: String, required: true },
        status: { type: String, required: true },
        adminName: { type: String, required: true },
        adminId: { type: String, required: true },
        createdAt: { type: Date, required: true },
        deliveryParcels: [
            {
                type: Schema.Types.ObjectId,
                ref: "delivery-parcels",
            },
        ],
    },
    { _id: true }
);

const RiderTask = getDbConnection("deliveryManagement").model<IRiderTaskModel>(
    "rider-tasks",
    RiderTaskSchema
);
export { RiderTask };
 

доставка-посылки

 import mongoose, { Schema } from "mongoose";
import { getDbConnection } from "../../../utils/db/db-connect";
import { IDeliveryParcelModel } from "../interfaces/delivery-parcels.interface";
const DeliveryParcelsSchema: Schema<IDeliveryParcelModel> = new Schema<IDeliveryParcelModel>(
    {
        parcelId: { type: String, required: true },
        address: { type: String, required: true },
        addressLocation: {
            lat: { type: Number, required: true },
            lng: { type: Number, required: true },
        },
        customerName: { type: String, required: true },
        customerPhone: { type: String, required: true },
        processingStatus: { type: String, required: true },
        amount: { type: Number, required: true },
        riderTaskId: { type: Schema.Types.String, ref: "rider-tasks" },
        type: { type: String, required: true, enum: ["COD", "NONCOD"] },
        postedStatus: {
            status: { type: String },
            statusKey: { type: String },
            signature: { type: String },
            reason: { type: String },
            checkBoxData: [{ type: String }],
            adminId: { type: String },
            adminName: { type: String },
        },
    }
);

const DeliveryParcels = getDbConnection(
    "deliveryManagement"
).model<IDeliveryParcelModel>("delivery-parcels", DeliveryParcelsSchema);
export { DeliveryParcels };
 

Мой сервис

 private async createdRiderTaskHandler(ctx: Context<IRiderTaskModel>) {
    const { params } = ctx;
    const finalData: IParcelData[][] = await Promise.all(
        params.deliveryParcels.map((parcel) =>
            this.broker.call("parcel-data.getParcels", {
                id: parcel.parcelId,
            })
        )
    );
    const wrongParcels: string | any[] = [];
    const check = finalData[0].filter(
        (data) => data.currentStatus.status === "Dispatched"
    )[0];
    if (check) {
        wrongParcels.push(check.parcelId);
        const parcel = wrongParcels.join("rn");
        throw new Error(
            'These parcels "'   parcel   '" have already been dispatched'
        );
    }
    const codAmount = params.deliveryParcels
        .filter((data, i) => data.type === "COD")
        .reduce((total, b) => total   b.amount, 0);

    const customId = "RTD-"   Math.floor(100000   Math.random() * 900000);
    try {
        const taskData = omit({
            ...params,
            _id: customId,
            totalAmount: codAmount,
            forceAssignment: false,
            createdAt: new Date(),
        });

        const data = await RiderTask.create(taskData);
        return { message: data };
    } catch (error) {
        this.logger.error(error);
        return error;
    

   }
}
 

Комментарии:

1. Нужно ли добавлять данные обеих коллекций отдельно? если да, то как я смогу создать отношение?