2015-03-29 2 views
0

Я делаю REST API для GET, POST, PUT и DELETE, и теперь я делаю POST:TypeError в Promises [Node.js]

restAPI.js:

var restApi = { 
    POST: function(options) { 
    if (options.method !== 'POST') { 
     console.log('Method must be POST!'); 
    } 

    var entry = new options.model(options.data); 
    return entry.save; 

    }; 
}; 

module.exports = restApi; 

И теперь я могу потребовать в своих контроллерах и использовать. Я использую MongoDB и mongoose.

siteController.js:

var restAPI = require('./restAPI'); 

var siteController = { 
create: function(req, res, next) { 
    var data = req.body; 

    var options = { 
     method: 'POST', 
     model: Booking, 
     data: data 
    }; 


    restAPI.POST(options).then(function() { 
     res.redirect('/obrigado/' + req.cookies.locale); 
    }).then(undefined, function(error) { 
     console.log(error); 
    }); 
} 
}; 

module.exports = siteController; 

но возвращает мне следующую ошибку:

TypeError: Object function (options, fn) { 

if ('function' == typeof options) { 
    fn = options; 
    options = undefined; 
} 

if (!options) { 
    options = {}; 
} 

var self = this; 
var finalPromise = new Promise(fn); 

// Check for preSave errors 
var preSaveErr = self.$__presaveValidate(); 
if (preSaveErr) { 
    finalPromise.reject(preSaveErr); 
    return finalPromise; 
} 

// Validate 
var p0 = new Promise; 
if (this.schema.options.validateBeforeSave) { 
    p0 = self.validate(); 
} 

// Call save hooks on subdocs 
var p1 = p0.all(function() { 
    var subDocs = self.$__getAllSubdocs(); 
    return subDocs.map(function (d) {return d.save();}); 
}); 

// Handle save and resaults 
p1 
    .then(this.$__handleSave.bind(this, options)) 
    .then(function (result) { 
    self.$__reset(); 
    self.$__storeShard(); 

    var numAffected = 0; 
    if (result) 
     numAffected = (Array.isArray(result)) ? result.length : result; 
    // was this an update that required a version bump? 
    if (self.$__.version && !self.$__.inserting) { 
     var doIncrement = VERSION_INC === (VERSION_INC & self.$__.version); 
     self.$__.version = undefined; 

     if (numAffected <= 0) { 
     // the update failed. pass an error back 
     return finalPromise.reject(new VersionError); 
     } 

     // increment version if was successful 
     if (doIncrement) { 
     var key = self.schema.options.versionKey; 
     var version = self.getValue(key) | 0; 
     self.setValue(key, version + 1); 
     } 
    } 

    self.emit('save', self, numAffected); 
    return finalPromise.fulfill(self, numAffected); 
    } 
    , function (err) { 
    // If the initial insert fails provide a second chance. 
    // (If we did this all the time we would break updates) 
    if (self.$__.inserting) { 
     self.isNew = true; 
     self.emit('isNew', true); 
    } 
    finalPromise.reject(err); 
    }) 
    .end(); 

return finalPromise; 
} has no method 'then' 
    at siteController.booking.create (/home/ubuntu/workspace/front-back/app/app/server/controllers/site.js:84:29) 
    at Layer.handle [as handle_request] (/home/ubuntu/workspace/front-back/node_modules/express/lib/router/layer.js:82:5) 
    at next (/home/ubuntu/workspace/front-back/node_modules/express/lib/router/route.js:100:13) 
    at exports.setLocale (/home/ubuntu/workspace/front-back/app/app/server/middleware/index.js:8:3) 
    at Layer.handle [as handle_request] (/home/ubuntu/workspace/front-back/node_modules/express/lib/router/layer.js:82:5) 
    at next (/home/ubuntu/workspace/front-back/node_modules/express/lib/router/route.js:100:13) 
    at Route.dispatch (/home/ubuntu/workspace/front-back/node_modules/express/lib/router/route.js:81:3) 
    at Layer.handle [as handle_request] (/home/ubuntu/workspace/front-back/node_modules/express/lib/router/layer.js:82:5) 
    at /home/ubuntu/workspace/front-back/node_modules/express/lib/router/index.js:234:24 
    at Function.proto.process_params (/home/ubuntu/workspace/front-back/node_modules/express/lib/router/index.js:312:12) 

Что я делаю неправильно? Может кто-нибудь мне помочь ?

+0

Почему не доверяют 'restAPI.POST()' 'установить options.method =«POST'' вместо того, чтобы проверить, что уже установлены правильно. Если вы не хотите изменять переданные 'options', тогда клонируйте объект перед установкой' .method'. –

+0

Если вы хотите отклонить условия ошибки, то вы должны сделать больше, чем просто сделать запись в журнале. Вернув отвергнутое обещание, вы убедитесь, что 'restAPI.POST()' (и другие методы) всегда возвращают обещание - выполнено или отклонено - поэтому вызывающий может принять решение о соответствующем курсе действий. –

ответ

0

Ваш метод .POST возвращает entry.save, что является методом, а не обещанием, и это, по сути, сообщение об ошибке. Он говорит, что эта большая функция там не имеет свойства .then.

Вы должны назвать его:

var entry = new options.model(options.data); 
return entry.save(/* provide any needed arguments here */); 
+0

Отличное объяснение .. но что я должен предоставить @JLRishe, аргумент ошибки? –

+0

Не знаю. Какие аргументы ожидают «резервирование # save»? Я не знаю, как работает ваш API бронирования. Основываясь на ошибке, похоже, что он принимает необязательный аргумент 'options' и аргумент' fn', поэтому я бы предположил некоторый набор параметров и функцию обратного вызова. Возможно, оба аргумента являются необязательными, но опять же, это будет зависеть от того, как работает API. – JLRishe

+0

Только аргумент ошибки :) .. Большое спасибо JL, вы действительно помогаете мне и более важно, научите меня. –