我有一个称为服务的模型
/**
* 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'
}
},
};
这是我添加服务的操作文件。
由于某种原因,等待Services.create无法正常工作,并且由于未定义serviceRecord,因此返回此badRequest错误。但是当我转而使用此处是exec的promises时,我看到正在创建记录,但是作为exec中第二个参数的结果也未定义。
由于我不得不将studioId推入服务,因此我别无选择,只能在制作记录时将其包括在内,尽管这也显示badRequest,但它会将记录放入数据库中。
如果有人能告诉我问题的原因,将不胜感激。我检查了要放入Service模型中的参数类型,它们确实匹配,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";
}
}
};
在控制器中,错误和结果的控制台日志语句由于某种原因未定义返回。
该如何解决?任何帮助将不胜感激。
答案 0 :(得分:0)
如documentation for Waterline's create method中所述,如果要复制新创建的记录,则需要链接.fetch()
方法或.meta({ fetch: true })
应该执行以下操作:
let serviceRecord = await Services.create({
nameService: newNameService,
creditCost,
price
}).fetch();
sails.log.info(serviceRecord);
答案 1 :(得分:0)
在新版本的Sails中,您需要添加.fetch()
才能在使用.create()
时发回记录
来自docs的示例:
var newUser = await User.create({ fullName: 'Alice McBailey' }).fetch();