sails 中的 Create 方法创建了新记录,但 return 请求错误

Create method in sails makes a new record but return bad Request

我有一个名为服务的模型

/**
 * 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 错误。但是,当我转而使用 promises 这是 exec here 时,我看到正在创建记录,但作为 exec 中第二个参数的结果也未定义。

由于必须将studioId推入服务中,所以在做记录时只好将其包含进去,虽然这也是显示badRequest,但它是将记录放入数据库中。

如果有人能告诉我问题的原因是什么,我将不胜感激。我检查了我放入服务模型的参数类型,它们确实匹配,serviceName 是字符串,creditCost 和 price 是数字。

/**
 * 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;
      }
    }
  }
};

编辑:-

这是另一个名为 Timings 的 api,它也有同样的问题。是我在创建新文档或其他过程中做错了什么吗?

时序模型:-

/**
 * 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";
    }



  }
};

在控制器中,错误和结果的控制台日志语句由于某种原因返回未定义。

我该怎么做才能解决这个问题?非常感谢任何帮助。

documentation for Waterline's create method 中所述,如果您想要新创建记录的副本,则需要链接 .fetch() 方法或 .meta({ fetch: true })

像下面这样的事情应该做:

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

新版Sails使用.create()

需要添加.fetch()回传记录

来自 docs 的示例:

var newUser = await User.create({ fullName: 'Alice McBailey' }).fetch();