Non*_*Non 6 javascript node.js angularjs sails.js
我是NodeJS的新手,我在尝试在数据库中保存/保存一些数据时遇到问题.
让我们从头开始,这样你就可以更容易理解.我有一个运动列表,可选择选中或取消选中,这就是我需要坚持,检查的内容.
前端:
controller.js
$scope.toggleSportSelection = function(sport) {
var params = {};
params.user = $scope.customer.customer;
sport.checked = !sport.checked;
SportsFactory.setSportChecked(params);
};
Run Code Online (Sandbox Code Playgroud)
service.js
setSportChecked: function(params) {
var defer = $q.defer();
$http.post(CONSTANT_VARS.BACKEND_URL + '/sports/checked', params)
.success(function(sportChecked) {
LocalForageFactory.remove(CONSTANT_VARS.LOCALFORAGE_SPORTS_CHECKED, params);
defer.resolve(sportChecked);
})
.error(function(err) {
console.log(err);
defer.reject(err);
});
return defer.promise;
}
Run Code Online (Sandbox Code Playgroud)
我一直在调试这个前端部分,一切似乎都没问题......
现在回到结束:
setSportCtrl.js
module.exports = {
setCheck: function(req, res) {
var checkedSportParams = req.body;
SportSelectionService.sportChecked(checkedSportParams).then(function() {
res.json(200, {msg: 'OK'});
}, function(err) {
res.json(400, err);
});
}
}
Run Code Online (Sandbox Code Playgroud)
SportSelection.js(型号)
module.exports = {
connection: 'RedisServer',
attributes: {
sport: {
type: 'array',
required: false
},
user: {
type: 'string',
required: true
}
}
};
Run Code Online (Sandbox Code Playgroud)
在这部分我可以看到它console是如何在终端中打印的,但如果我这样做console.log(sportChecked)或者console.log(newSport)我得到的是一个阵列,它说null到处都是...
SportSelectionService.js
module.exports = {
sportChecked: function(params) {
var Promise = require('bluebird');
return new Promise(function(fullfill, reject) {
console.time('sportChecked_findOne');
SportSelection.findOne({
user: params.user
}).exec(function(err, sportChecked) {
console.timeEnd('sportChecked_findOne');
var newSport;
if (err) {
reject(new Error('Error finding user'));
console.error(err);
}else if (sportChecked) {
newSport = sportChecked.sport;
console.time('sportChecked_update');
SportSelection.update({
user: params.user
},
{
sport: newSport
}).exec(function(err, sportCheckedUpdated) {
console.timeEnd('sportChecked_update');
if (err) {
reject(new Error('Error on sportChecked'));
}else {
fullfill(sportCheckedUpdated);
}
});
if (sportChecked.sport) {
sportChecked.sport.push(params.sport);
console.log('New sport added');
}else {
sportChecked.sport = [params.sport];
}
}else {
console.time('sportChecked_create');
SportSelection.create({
sport: [params.sport],
user: params.user
}).exec(function(err, created) {
console.timeEnd('sportChecked_create');
if (err) {
reject(new Error('Error on sportChecked'));
}else {
fullfill(created);
}
});
}
});
});
}
Run Code Online (Sandbox Code Playgroud)
那你觉得我的问题在这里怎么样?我究竟做错了什么 ?
如果您正在使用mongooseJS(看来您是)并且该服务的目的是将运动添加到 sports 数组中,那么您可以使用该findOneAndUpdate方法(它将返回该方法的承诺exec)并显着减少服务:
module.exports = {
sportChecked: function(params) {
return SportSelection.findOneAndUpdate(
{user: params.user},
{$addToSet: {sports: params.sport}}
).exec();
}
};
Run Code Online (Sandbox Code Playgroud)
$addToSet仅当该值尚未存在于数组中时才会添加该值。如果可以接受重复项,您可以使用$push
正如评论中指出的,您可能正在使用水线。如果是这样,则该update方法的行为似乎与 类似findOneAndUpdate。所以也许这可能有效(我没有检查你是否需要打电话exec):
module.exports = {
sportChecked: function(params) {
return SportSelection.update(
{user: params.user},
{$addToSet: {sports: params.sport}}
).exec(); // Not sure if this is necessary
}
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |