I have recently learned a bit of ES6 and started my new project using koa.js running on io.js.
In the code below, I am trying to check if there is already another item with the same url slug
.
But the value of counter.next().value
always returns a function and hence the function _slugExists
always returns true
'use strict';
let _ = require('lodash');
let config = require('../../config');
let monk = require('monk');
let wrap = require('co-monk');
let db = monk(config.db);
let _apps = wrap(db.get('apps'));
function _validateApp(app) {
let slug = app.slug.trim();
if (!app.name.trim()) {
throw new Error('App name was not specified.');
}
if (!slug) {
throw new Error('App URL was not specified.');
}
if (_slugExists(slug)) {
throw new Error('Another app with the same URL already exists.');
}
}
function* _count(filter) {
yield _apps.count(filter);
}
function _slugExists(slug) {
let counter = _count({
slug: slug
});
return counter.next().value !== 0;
}
module.exports = {
list: function*(next) {
this.status = 200;
this.body = yield _apps.find({});
},
create: function*(next) {
try {
let app = this.request.body;
_validateApp(app);
this.status = 201;
this.body = {
id: yield _apps.insert({
name: app.name.trim(),
slug: app.slug.trim(),
created_at: new Date()
})
};
} catch (error) {
console.log(`[ERROR] ${error.message}`);
this.status = 500;
this.body = {
error: error.message
};
}
}
}
In koa, which is based on co, any async operation must
yield
promises all the way up to koa. You can alsoyield
generators, but not iterators. Particularly important is to make sure nested async operations are not left hanging:With that in mind, there are various ways you could fix your code, for example: