Метод create в sails создает новую запись, но возвращает неверный запрос - PullRequest
0 голосов
/ 10 мая 2019

У меня есть эта модель под названием Services

/**
 * Services.js
 *
 * @description :: A model definition represents a database table/collection.
 * @docs        :: https://sailsjs.com/docs/concepts/models-and-orm/models
 */

module.exports = {

  attributes: {

    //  ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦  ╦╔═╗╔═╗
    //  ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗
    //  ╩  ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝
    nameService: {
      type: "string",
      required: true,
      description: "Full representation of the service's name.",
      example: "Details of this particular service offered by the studio"
    },
    creditCost: {
      type: "number",
      required: true,
      description: "The number of credits required for this service",
      example: 2
    },
    creditsEarned: {
      type: "number",
      defaultsTo:0,
      description: "The number of credits required for this service",
      example: 200
    },
    price: {
      type: 'number',
      required: true,
      description:"The original price of this service",
      example:1500
    },
    rating: {
      type: 'number',
      defaultsTo:0,
      min: 0,
      max: 5,
    },



    //  ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗
    //  ║╣ ║║║╠╩╗║╣  ║║╚═╗
    //  ╚═╝╩ ╩╚═╝╚═╝═╩╝╚═╝


    //  ╔═╗╔═╗╔═╗╔═╗╔═╗╦╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
    //  ╠═╣╚═╗╚═╗║ ║║  ║╠═╣ ║ ║║ ║║║║╚═╗
    //  ╩ ╩╚═╝╚═╝╚═╝╚═╝╩╩ ╩ ╩ ╩╚═╝╝╚╝╚═╝


    studioId:{
      model:"Studios"
    },
    bookedServices:{
      collection: 'BookedServices',
      via: 'serviceId'

    },


    timings:{
      collection: 'Timings',
      via: 'serviceId'
    }

  },

};

Это мой файл действий, который добавляет службы.

По какой-то причине await Services.create не работает, и поскольку serviceRecord не определен, он возвращает эту ошибку badRequest. Но когда я перешел к использованию обещаний, которые здесь exec, я вижу, что запись создается, но результат, являющийся вторым параметром в exec, также становится неопределенным.

Поскольку мне приходилось вставлять studioId в службы, у меня не было выбора, кроме как включить его при создании записи, хотя это также показывает badRequest, оно помещает запись в базу данных.

Буду очень признателен, если кто-нибудь скажет мне, в чем причина проблемы. Я проверил типы параметров, которые я помещаю в модель Service, и они совпадают, serviceName - это строка, creditCost и цена - это число.

/**
 * studiosControllers/services/addServices.js
 *
 * @description :: Login action for studios.
 * @help        :: See https://sailsjs.com/docs/concepts/actions
 */

module.exports = {
  friendlyName: "Add Services",

  description: "Studios adding services.",

  extendedDescription: `This action will do the part of adding services to the particular studio.`,

  inputs: {
    nameService: {
      type: "string",
      required: true,
      description: "Full representation of the service's name.",
      example: "We are a great studio that offer variety of services..."
    },
    creditCost: {
      type: "number",
      required: true,
      description: "The number of credits required for this service",
      example: 2
    },

    price: {
      type: "number",
      required: true,
      description: "The original price of this service",
      example: 1500
    }
  },

  exits: {
    success: {
      description: "New service was created successfully."
    },

    invalid: {
      responseType: "badRequest",
      description: "Some of the provided details are invalid.",
      extendedDescription:
        "If this request was sent from a graphical user interface, the request " +
        "parameters should have been validated/coerced _before_ they were sent."
    }
  },

  fn: async function(inputs, exits) {
    var { nameService, creditCost, price } = inputs;
    console.log(typeof nameService);
    console.log(typeof creditCost);
    console.log(typeof price);

    let newNameService = nameService.toLowerCase();
    var serviceRecord;

    Services.create({ nameService: newNameService, creditCost:creditCost, price:price,studioId:this.req.params.studioId }).exec(
      function(err,result) {
        if (err) {
          return this.res.send(err);
        }
        console.log(err);
        serviceRecord=result;
        console.log(serviceRecord);
      }
    );

    // try {
    //   serviceRecord = await Services.create({
    //     nameService: newNameService,
    //     creditCost,
    //     price
    //   });
    //   sails.log.info(serviceRecord);
    // } catch (err) {
    //   switch (err.name) {
    //     case "UsageError":
    //       return this.res.badRequest(err);
    //     default:
    //       throw err;
    //   }
    // }

    // If there was info mismatch, throw invalid error
    if (!serviceRecord) {
      throw "invalid";
    }

    let id = this.req.studioId;
    var studioRecord;

    try {
      studioRecord = await Studios.findOne({
        id
      });
      studioRecord.services.add(serviceRecord);
      studioRecord.save();
      return exits.success({
        message: "Service added successfully to the studio",
        data: serviceRecord
      });
    } catch (err) {
      switch (err.name) {
        case "UsageError":
          return this.res.badRequest(err);
        default:
          throw err;
      }
    }
  }
};

EDIT: -

Это еще один API под названием Timings, и даже у него та же проблема. Это то, что я сделал неправильно в процессе создания нового документа или что-то еще?

Сроки Модель: -

/**
 * Timings.js
 *
 * @description :: A model definition represents a database table/collection.
 * @docs        :: https://sailsjs.com/docs/concepts/models-and-orm/models
 */

module.exports = {
  attributes: {
    //  ╔═╗╦═╗╦╔╦╗╦╔╦╗╦╦  ╦╔═╗╔═╗
    //  ╠═╝╠╦╝║║║║║ ║ ║╚╗╔╝║╣ ╚═╗
    //  ╩  ╩╚═╩╩ ╩╩ ╩ ╩ ╚╝ ╚═╝╚═╝


    eventInTime: {
      type: "ref",
      required: true,
      columnType: "datetime",
      description: "The date of the event starting",
      extendedDescription: `To store a date, make a date object with 
      'let date=new Date(year, month, day, hours, minutes, seconds, milliseconds)' 
      and then stringify it with 'JSON.stringify(date)' and then store it in the database 

      Send in "stringify" ed version of the date object to this input
      `
    },
    eventOutTime: {
      type: "ref",
      required: true,
      columnType: "datetime",
      description: "The date of the event ending",
      extendedDescription: `To store a date, make a date object with 
      'let date=new Date(year, month, day, hours, minutes, seconds, milliseconds)' 
      and then stringify it with 'JSON.stringify(date)' and then store it in the database 

      Send in "stringify" ed version of the date object to this input
      `
    },
    numberOfSlotsAvailable: {
      type: "number",
      required: true,
      description: "The number of available slots",
      example: 15
    },


    //  ╔═╗╔╦╗╔╗ ╔═╗╔╦╗╔═╗
    //  ║╣ ║║║╠╩╗║╣  ║║╚═╗
    //  ╚═╝╩ ╩╚═╝╚═╝═╩╝╚═╝

    //  ╔═╗╔═╗╔═╗╔═╗╔═╗╦╔═╗╔╦╗╦╔═╗╔╗╔╔═╗
    //  ╠═╣╚═╗╚═╗║ ║║  ║╠═╣ ║ ║║ ║║║║╚═╗
    //  ╩ ╩╚═╝╚═╝╚═╝╚═╝╩╩ ╩ ╩ ╩╚═╝╝╚╝╚═╝

    bookedServicesId:{
      model:"BookedServices"
    },
    serviceId:{
      model:"Services"
    }
  }
};

Регулятор времени: -

/**
 timingsController/entrance/add-timings.js
 *
 * @description :: Action for adding timings to services.
 * @help        :: See https://sailsjs.com/docs/concepts/actions
 * FIXME: 
 */

module.exports = {
  friendlyName: "Add timings",

  description: "Studi`os adding timings for their services.",

  extendedDescription: `This action will do the part of adding timings to the particular service.`,

  inputs: {
    eventInTime: {
      type: "ref",
      required: true,
      columnType: "datetime",
      description: "The date of the event starting",
      extendedDescription: `To store a date, make a date object with 
      'let date=new Date(year, month, day, hours, minutes, seconds, milliseconds)' 
      and then stringify it with 'JSON.stringify(date)' and then store it in the database 

      Send in "stringify" ed version of the date object to this input
      `
    },
    eventOutTime: {
      type: "ref",
      required: true,
      columnType: "datetime",
      description: "The date of the event ending",
      extendedDescription: `To store a date, make a date object with 
      'let date=new Date(year, month, day, hours, minutes, seconds, milliseconds)' 
      and then stringify it with 'JSON.stringify(date)' and then store it in the database 

      Send in "stringify" ed version of the date object to this input
      `
    },
    numberOfSlotsAvailable: {
      type: "number",
      required: true,
      description: "The number of available slots",
      example: 15
    }
  },

  exits: {
    success: {
      description: "New timing record was created successfully."
    },

    invalid: {
      responseType: "badRequest",
      description: "Some of the provided details are invalid.",
      extendedDescription:
        "If this request was sent from a graphical user interface, the request " +
        "parameters should have been validated/coerced _before_ they were sent."
    }
  },

  fn: async function(inputs, exits) {
    var moment = require("moment");

    var { eventInTime,eventOutTime, numberOfSlotsAvailable } = inputs;


    // var eventInTimeMix = moment(eventInTime);
    // var eventInTimeDate = eventInTimeMix.utc().format("DD-MM-YYYY HH:mm a");
    // console.log(`This is eventInTimeMix: ${eventInTimeMix}`)
    // console.log(`This is eventInTimeDate: ${eventInTimeDate}`)

    // var eventOutTimeMix = moment(eventOutTime);
    // var eventOutTimeDate = eventOutTimeMix.utc().format("DD-MM-YYYY HH:mm a");



    var timingRecord;
    let serviceId = this.req.params.serviceId;
    console.log(serviceId)

  //   timingRecord=await Timings.create({
  //     eventInTimeDate,
  //     eventOutTimeDate,
  //     numberOfSlotsAvailable,
  //     serviceId
  //   }).fetch()

  // console.log(timingRecord)

    Timings.create({eventInTime,
      eventOutTime,
      numberOfSlotsAvailable,
      serviceId})

    .exec(function(err, result) {
      // if (err) {
      //   return this.res.send({err});
      // }
      // return this.res.status(200).send({ message: "Service added successfully" });
      console.log(`This is the error ${err}`);
      console.log(`This is the result ${result}`);

    });

    // try {
    //  timingRecord=await Timings.create({
    //   eventInTimeDate,
    //   eventOutTimeDate,
    //   numberOfSlotsAvailable,
    //   serviceId
    // })
    // } catch (err) {
    //   switch (err.name) {
    //     case "UsageError":
    //       return this.res.badRequest(err);
    //     default:
    //       throw err;
    //   }
    // }

    //FIXME: Remove the ommenting from the below line for verification

    // If there was info mismatch, throw invalid error
    if (!timingRecord) {
      throw "invalid";
    }



  }
};

В контроллере операторы журнала ошибок и результатов по какой-то причине возвращают неопределенное значение.

Что я могу сделать, чтобы это исправить? Любая помощь с благодарностью.

Ответы [ 2 ]

1 голос
/ 13 мая 2019

В новой версии Sails вам нужно добавить .fetch() для отправки обратно записей при использовании .create()

Пример из документов :

var newUser = await User.create({ fullName: 'Alice McBailey' }).fetch();
1 голос
/ 10 мая 2019

Как уже упоминалось в документации для метода создания Waterline , если вы хотите получить копию только что созданной записи, вам нужно либо связать метод .fetch(), либо .meta({ fetch: true })

Что-то вроде следующего должно сделать это:

let serviceRecord = await Services.create({
  nameService: newNameService,
  creditCost,
  price
}).fetch();
sails.log.info(serviceRecord);
...