嗨,我正在尝试使用 MEANjs 进行开发。
我制作了一个包含“帐户”、“收入”和“费用”的 CRUD 的应用程序。每个都是使用创建的yo meanjs:crud-module <module-name>
。现在我不会用一种类型来扩展我的项目:“转账”,它包含收入和费用,即创建转账会在发送帐户上创建费用,在接收帐户上创建收入。
我想尽可能轻松和合乎逻辑地创建它。
我想尽可能将大部分逻辑放在服务器端是有意义的。这样前端将转账识别为一个转账对象,该对象是通过组合来自收入和费用模型的数据在后端控制器中创建的。
为了确定收入实际上属于转移,我将以下属性添加到模型中,在其中我使用属性判断它是否是转移:isTransfer,以及使用“费用”属性属于哪个费用。
'use strict';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Schema = mongoose.Schema;
/**
* Income Schema
*/
var IncomeSchema = new Schema({
name: {
type: String,
default: '',
required: 'Please fill Income name',
trim: true
},
amount: {
type: String,
default: '',
required: 'Please fill Income amount',
trim: true
},
date: {
type: Date,
default: '',
required: 'Please fill Income date',
trim: true
},
monthly: {
type: Boolean,
default: '',
required: 'Please fill whether income is recurring monthly',
trim: true
},
yearly: {
type: Boolean,
default: '',
required: 'Please fill whether income is recurring yearly',
trim: true
},
account: {
type: Schema.ObjectId,
ref: 'Account',
required: 'Please select account'
},
isTransfer: {
type: Boolean,
default: false,
trim: true
},
expense:{
type: Schema.ObjectId,
ref:'Expense'
},
created: {
type: Date,
default: Date.now
},
user: {
type: Schema.ObjectId,
ref: 'User'
}
});
mongoose.model('Income', IncomeSchema);
然后我想在整个堆栈中创建传输就像运行一样简单:
yo meanjs:crud-module transfers
我的下一步是删除后端转账的模型并重写后端控制器,以便每次我尝试创建转账时它都会产生收入和费用。
然后,控制器还会从后端控制器一直返回到前端的实际“传输对象”。
最初,我尝试将转移对象添加为仅存在于前端,并从前端服务发送请求以创建收入和支出,但它严重阻塞了代码,我不得不多次调用后端来创建一个转移. IE
- 创造收入 -> 节省资源以获取收入
- 从响应中获取收入 ID
- 使用收入 ID 创建费用 -> 保存资源调用以获取费用
- 从响应中获取费用 ID
- 使用费用 ID 更新收入。-> 再次保存资源以获取收入
我认为在后端控制器中创建传输对象会更有意义。这是管理传输对象的合理方式吗?
以另一种方式创建转移是否更有意义?或者在堆栈的另一个层次上?
我想我可以创建一个仅包含对收入和支出的引用的转移模型,但我仍然需要正确创建收入/支出对象:
太好了,我运行了yo meanjs:crud-module <module-name>
命令并生成了一个传输模块,然后删除了整个传输模型,并从服务器控制器中将其注释掉。不过,我保留了前端表示,列出并创建、编辑等。服务器控制器需要重新设计,以便它与收入和支出模型相关。下面的例子:
服务器 Transfers 控制器的 create 方法因此变成了一个令人厌恶的收入和支出,就像 soo:
/**
* Create a Income and Expense
*/
exports.create = function(req, res) {
var income = new Income(req.body);
var expense = new Expense(req.body);
expense.user = income.user = req.user;
console.log('Request: ' + JSON.stringify(req.body));
//This should create an income and expense that is part of a transfer
expense.isTransfer = income.isTransfer = true;
//Generate ID's manually to create the relation between income and expense:
income.expense = expense._id = mongoose.Types.ObjectId();
expense.income = income._id = mongoose.Types.ObjectId();
//Set income and expense receiving and sending account, these attributes where simply attached to the body:
income.account = req.body.receivingAccount;
expense.account = req.body.sendingAccount;
//Save income if successfull, also save expense, if both succeeds return income and expense
income.save(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
expense.save(function(err) {
if (err) {
return res.status(400).send({
message: errorHandler.getErrorMessage(err)
});
} else {
res.jsonp({income: income, expense: expense});
}
});
}
});
};
而创建Transfer的客户端控制器,也没有那么难看,注意创建的Transfer对象不对应mongoose模型中定义的Transfer对象:
// Create new Transfer when received in the server controller this yields both an income and an expense.
$scope.create = function() {
// Create new Transfer object, this defines what your request.body will contain.
var transfer = new Transfers ({
name: this.name,
amount: this.amount,
date: this.date,
monthly: this.recurring==='monthly',
yearly: this.recurring==='yearly',
receivingAccount: this.receivingAccount._id,
sendingAccount: this.sendingAccount._id
});
// Redirect after save
transfer.$save(function(response) {
$location.path('transfers/' + response._id);
// Clear form fields
$scope.name = '';
}, function(errorResponse) {
$scope.error = errorResponse.data.message;
});
};
谢谢